[英]Objective-C: correct method for passing
你怎么能在方法中傳遞變量?
我有一個UITabBarController
。
- (void)tabBarController:(UITabBarController *)tabBarController
didSelectViewController:(UIViewController *)viewController {
NSLog(@"my ns string %@", viewController.tabBarItem.title);
}
我需要NSString變量集,以便在此事件中指定表的單元格時可以訪問它。 這個想法是表格內容取決於標簽標題。
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
在我熟悉的其他語言中,我總是只在函數中傳遞變量,或者它們是類中的變量。 我是Objective-C的新手,我不知道如何處理變量范圍。
我讀到可以通過創建一個僅用於變量的類來完成。 這是正確的方法嗎? 建議非常感謝。
看起來這個問題從未得到正確回答。 您的問題的答案是,您可以將變量聲明為@property
並在控制器之間傳遞值。
例如: -
如果要將某些內容傳遞給viewController
,請將其聲明為該類中的屬性,
@property(nonatomic, retain) NSString *someValue;
並設置為,
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
viewController.someValue = someValues;
}
你可以在viewController類中使用它,
NSLog(@"value is %@", self.someValue);
在您的情況下,您可以直接在cellForRowAtIndexPath:
方法中使用self.tabbarItem.title
。
您仍然可以在Objective-C中傳遞變量 - 通常用於擁有該表的視圖控制器,您可以將該字符串值傳遞給它。
如果在更全局的范圍內需要字符串,則可以將其作為要訪問的屬性放在應用程序委托中。
如果隨着時間的推移,應用程序委托中會出現太多事情,您可以將它們分組為單例 - 應用程序委托本身就是一個單例,但是您可以創建其他實例,這些實例會在應用程序的生命周期中保留,並使其存儲在中心位置整個應用程序中常用的值。
在我的經驗中,Objective-C應用程序獲得了一種自上而下的方法。 它有點並行,你有視圖層次結構和控制器層次結構。
iphone的視圖層次結構從窗口開始,然后轉到第一個子視圖,然后轉到后續子視圖。
窗口的控制器模擬是應用程序委托,通常創建第一個視圖控制器 。 從那里,每個(全屏)視圖都有一個控制器,它們往往由其父視圖控制器創建和設置。
在您的情況下,似乎選項卡應該具有相同的視圖,並且它們應該從選項卡欄控制器的子類獲得某種形式的指向其數據的指針。
注意:以下答案超出了方法/視圖控制器之間傳遞值的范圍。
如果表的視圖控制器是標簽欄控制器中的一個視圖控制器,則只需使用該行即可獲得標簽欄的標題 ,
NSString *title = self.tabbarItem.title;
這個想法是表格內容取決於標簽標題。
你可以找到標題的“標簽”屬性。 我想你可以用:
//In some place or your UITabBarController
...
UITabBarItem *item;
...
item.tag = YOUR_DEFINED_VALUE;
...
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
switch(tabBarController.tabBar.selectedItem.tag) {
case YOUR_DEFINED_VALUE:
...
self.typeOfCell = CELL_TYPE;
[tableView reloadData];
...
}
}
UITabBarItem從具有'tag'屬性的UIBarItem擴展。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.