【问题标题】:Objective-C: correct method for passingObjective-C:正确的传递方法
【发布时间】:2011-07-31 05:39:14
【问题描述】:

如何在方法之间传递变量?

我有一个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 的新手,我不确定如何处理变量范围。

我读到它可以通过创建一个仅用于变量的类来完成。这是正确的方法吗?非常感谢您的建议。

【问题讨论】:

  • 我认为 Objective-c 正在与您尝试编写的代码类型进行激烈的斗争,它非常基于 MVC,并且信息或多或少地从上到下传播,基本上标签栏控制器应该传递字符串,(或更一般地说,需要的最小外部信息量)然后视图控制器应该根据传入的信息进行自己的设置。有关如何传递信息的更多信息,请参见 setter/getters/accessors。

标签: ios objective-c iphone scope


【解决方案1】:

您仍然可以在 Objective-C 中传递变量 - 通常对于拥有该表的视图控制器,您可以将该字符串值传递给它。

如果在更全局的范围内需要该字符串,您可以将其作为要访问的属性放在应用程序委托中。

如果随着时间的推移,太多的东西最终出现在应用程序委托中,您可以将它们分组到一个单例中 - 应用程序委托本身就是一个单例,但是您可以创建其他实例,这些实例在应用程序的生命周期中一直存在并成为中心用于存储应用程序中常用值的位置。

【讨论】:

    【解决方案2】:

    根据我的经验,Objective-C 应用程序有点自上而下的方法。它有点平行,你有视图层次结构和控制器层次结构。

    iphone 的视图层次结构从窗口开始,然后到第一个子视图,然后是后续子视图。

    window 的控制器模拟是应用程序委托,它通常创建第一个视图控制器。从那里开始,每个(全屏)视图都有一个控制器,它们往往由其父视图控制器创建和设置。

    在您的情况下,选项卡似乎应该具有相同的视图,并且它们应该从 标签栏控制器的子类中获取某种形式的指向其数据的指针

    【讨论】:

      【解决方案3】:

      注意:以下答案超出了方法/视图控制器之间传递值的范围。

      如果表格的视图控制器是tabbar控制器中的视图控制器之一,则只需使用该行即可获取标签栏的title

      NSString *title = self.tabbarItem.title;  
      

      【讨论】:

        【解决方案4】:

        这个想法是表格内容取决于选项卡标题。

        您可以使用标题的“标签”属性。我认为您可以使用:

        //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

        【讨论】:

          【解决方案5】:

          看起来这个问题从来没有被正确回答过。您的问题的答案是,您可以将变量声明为 @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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多