【问题标题】:Issue with sending NSString objects from UITableViewController to UIViewController (Using Storyboards)将 NSString 对象从 UITableViewController 发送到 UIViewController 的问题(使用情节提要)
【发布时间】:2012-04-14 21:51:33
【问题描述】:

所以我遇到了这个让我发疯了好几个小时的问题,我觉得很愚蠢,因为它看起来很简单。在过去的 3 个小时里,我一直在网上搜索并弄乱代码,但我仍然无法弄清楚:(

在开始之前,我正在使用 Xcode 4.3.1 并在 iOS 5.1 上进行测试(模拟器和物理设备)。

这就是我到目前为止所做的:

  • 使用故事板连接我的所有观点
  • 我的一个视图是 UITableViewController,它链接到 UIViewController(使用“推送”,它可以在 2 个视图之间来回正常工作)
  • UITableViewController 子类称为 ScheduleViewController
  • UIViewController 子类称为 EventViewController
  • 我已经用适当的内容填充了我的所有部分和表格单元格(我正在使用 textLabel 和 detailTextLabel(这不是问题) - 对于 UIViewController,我只添加了一个标签,并为该标签生成了一个 IBOutlet,名为:headerLabel

这就是我想要完成的:

  • 当用户单击 ScheduleViewController 中的表格单元格时,转到 EventViewController(到目前为止它可以工作!)
  • 基于选定的表格单元格,将 textLabel.text、detailTextLabel.text 和 Section Header 文本传递给 EventViewController(有点工作,所有值都显示为 NSLog,但仅此而已???)
  • 我认为最好从小处着手,因此我将首先将 headerLabel 文本(在 EventViewController 中)设置为 Section Header Text(在 ScheduleViewController 中)——当我检查值时,这似乎再次起作用使用 NSLog,但是当我尝试设置 headerLabel 的实际文本时,它只显示和空字符串:(

这是我卡住的地方以及到目前为止我所尝试的:

  • 首先我已经做了一些完全相同的事情(除了它是在 iOS 4 中并且我没有使用情节提要),我所做的是在 UITableViewController 中的 didSelectRowAtIndexPath: 方法中,我只是做了类似(并且工作正常:)):

    EventViewController *eventViewController = [[EventViewController alloc] initWithNibName:@"EventViewController" bundle:nil]; eventViewController.headerLabel.text = stringToPass;

  • 当然,这是我尝试的第一件事,当然它没有奏效,因为这就是编程的方式哈哈。

  • 接下来我在 EventViewController 中创建了一个自定义的 init 方法:

    • (id) initEventTime: (NSString *) eventTime andName: (NSString *) eventName andDate: (NSString *) eventDate;
  • 首先我尝试在 ScheduleViewController 中的 didSelectRowAtIndexPath: 方法中调用它,它有点工作,这是 EventViewController 中的方法:

    //Method to initialize event time, name, and date.
    
    • (id) initEventTime: (NSString *) eventTime andName: (NSString *) eventName andDate: (NSString *) eventDate { self = [super initWithNibName:@"EventViewController" bundle:nil]; 如果(自己) { NSLog(@"我的自定义"); // 自定义初始化

      //NSLog(@"%@",eventTime); //NSLog(@"%@",eventName); //NSLog(@"%@",eventDate); NSString *mystr = [NSString stringWithFormat:@"%@",eventDate]; NSLog(@"1: %@",mystr); [自我设置事件日期:事件日期]; NSString *mystr2 = [self getTheEventDate]; NSLog(@"2: %@",mystr2); headerLabel.text = [self getTheEventDate]; NSLog(@"label: %@", headerLabel.text); NSLog(@"3: %@", eventDate);

      //self.headerLabel.text = [NSString stringWithFormat:@"%@",eventDate]; } 回归自我; }

  • 这是我在 didSelectRowAtIndexPath: 方法中调用方法的方式(在 ScheduleViewController 中):

    EventViewController *evc = [[EventViewController alloc] initEventTime:timeValue andName:eventValue andDate:dateValue];

  • 正如您在上面看到的,我首先使用 NSLog 检查了值是否出现在输出窗口中,它们都出现了!

  • 但是当我尝试设置headerLabel的时候还是返回了一个空字符串
  • 然后我尝试在 EventViewController 中创建一个 getter 和 setter(如上所示),称为 getTheEventDate 和 setTheEventDate。
  • 在这些方法中,我只需使用 eventDate 参数设置TheEventDate,然后获取值;并再次出现在输出窗口中,但是 headerLabel 的空字符串
  • 我还尝试使用 NSLog 来获取 eventDate 的值,使用 NSLog 来获取 headerLabel 的文本值,并使用另一个 NSLog 来确保 eventDate 不为空。
  • 这是输出窗口的输出:

    2012-03-31 我的习惯 2012-03-31 7月28日 2012-03-31 2:7月28日 2012-03-31 标签:(空) 2012-03-31 3:7月28日

【问题讨论】:

    标签: objective-c xcode ios5 storyboard


    【解决方案1】:

    如果您的视图控制器是从情节提要中加载的,那么与 nib 相关的任何事情都将是一个坏主意。 :-)

    处理情节提要转换的神奇方法是 prepareForSeque:。看看它; segue 引用了所涉及的控制器,并且 sender 参数将您链接到启动操作的控件。

    编辑:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        EventViewController *next = (EventViewController *)[segue destinationViewController];
        next.headerLabel.text = @"Hello!";
    }
    

    在实际代码中,您需要使用发送者通过向表询问发送者的索引路径或类似的东西来找出要传递的实际信息。

    【讨论】:

    • 是的,我试过了,结果还是一样。我尝试使用 eventViewController.headerLabel.text = theDate; 直接设置 headerLabel (这只是给了我一个空字符串)我还尝试使用 prepareForSegue 中的自定义 init 方法,但我仍然只在输出窗口中得到结果
    • 所以在我的自定义初始化方法中取出[super initWithNibName]?我最初只是将它作为一种方法: - (void) initEventTime: (NSString *) eventTime andName: (NSString *) eventName andDate: (NSString *) eventDate;但这也没有用
    • 我也尝试过设置 segue 的标识符,但这也没有用,我喜欢编程,但有时我也会感到沮丧
    • 在您开始做复杂的事情之前,您应该假设故事板/segue 机制将自动加载您的视图控制器。 唯一 您应该需要的是 prepareForSegue:将数据传递给新控制器的代码。
    • huzzah 我们成功了!所以我在我的自定义初始化方法中去掉了 [super initWithNibName] 的东西,并改变了它,所以没有返回类型,它工作了!唯一的问题是我仍然需要创建一个方法来设置 eventDate,然后我必须在 viewWillAppear 方法中设置 headerLabel.text 因为当我在我的方法中设置它时它仍然只出现在 NSLog
    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 2012-06-28
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2015-04-04
    相关资源
    最近更新 更多