【问题标题】:How to reference tableView from a view controller during a segue如何在 segue 期间从视图控制器引用 tableView
【发布时间】:2011-12-17 09:11:39
【问题描述】:

我是 iOS 开发新手,所以请放轻松 :)

使用适用于 iOS 5 的 Xcode 4.2,我在 IB 中构建了一个视图控制器,其中的一个 tableview 通过 push segue(在 table view cell 级别)链接到一个详细视图控制器

我想根据所选单元格的索引使用来自我的数据源的数据设置详细信息页面标签。最初我对“didSelectRowAtIndexPath”进行了编码,结果发现这是在 segue 处理之后调用的,然后发现我需要调用 prepareForSegue

我的问题是,无论我尝试什么,因为 tableView 不是传递给 prepareForSegue 的参数(与我迄今为止使用的大多数其他方法不同),我正在努力按顺序访问视图控制器中的 tableView调用 indexPath 方法,以便我可以引用我的数据源

我见过很多使用 self 的示例,如下所示,但这会导致错误,指出视图控制器中不存在 tableView

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

  NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
  DetailViewController *detail = [segue destinationViewController];
  detail.primary = [datasource objectAtIndex:selectedIndexPath.row];
  detail.seconday = [datalist objectForKey:detail.primary];
}

我也试过

ViewController *main = [segue viewController];

而不是使用self,但这会导致同样的问题

我知道我可以将示例重写为 Table View Controller,但想知道这种方式是否可行?正如我所看到的,人们在开发中使用这两种方法

作为参考,我正在关注本教程...http://kurrytran.blogspot.com/2011/10/ios-5-storyboard-and.html

当我到达完成详细页面的部分时,我想,为什么不使用 segue 将表格视图单元格链接到详细页面,并在详细页面之前编写状态和资本的复制代码显示。从本教程可以看出,主控制器是一个视图控制器

我的理解是,如果以后需要开发成更复杂的东西,不使用 UITableViewController 会给任何应用程序更大的灵活性

希望你能帮忙, 伊兹

【问题讨论】:

    标签: uiviewcontroller ios5 tableview


    【解决方案1】:

    我也是 iOS 新手,但值得一提:

    听起来您需要在 UIViewControllerClass 中创建指向表视图对象的指针。

    @interface YourClass : UIViewController
    {
        IBOutlet UITableView  *MyTableView;
    }
    @property ... IBOutlet UITableView *MyTableView;
    

    ...然后将其连接到 IB 中的“表格视图”。这样您就可以在 prepareForSegue 中访问 UITableView 对象。

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        NSIndexPath *selectedIndexPath = [self.MyTableView indexPathForSelectedRow];
        ...
    }
    

    【讨论】:

    • 伊恩,太棒了。在将 tableview 添加到接口声明(和相关代码)之后,它的工作是一种享受。我认为我很困惑,因为 tableview 已经在视图控制器中用于其他方法,但显然这是由于声明 @interface ViewController : UIViewController<UITableViewDelegate, UITableViewDataSource> ,尽管这对于非 tableview 方法来说还不够
    【解决方案2】:

    SWIFT 2 更新

    我将 tableView “连接”为 ViewController 中情节提要的出口。

    像这样:@IBOutlet weak var tableView: UITableView!

    只需将您的 tableView 拖入 ViewController 并使其成为插座。然后就可以引用它的属性如self.tableView.reloadData().

    在我将 tableView 添加为引用出口之前,此属性以及引用 tableView 的其他属性都给了我错误。

    将此添加到您的课程中: class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

    indexPath.row 现在应该可以工作了,segues 也一样。你也可以像这样使用instantiateViewControllerWithIdentifier

      func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    
            let myOtherView = self.storyboard!.instantiateViewControllerWithIdentifier("otherViewController") as! otherViewViewController
    
    
                myOtherView.url = NSURL(string:"\(array[indexPath.row])")
    
                self.presentViewController(myOtherView, animated: true, completion: nil)
    
    
        }
    

    希望对您有所帮助。

    【讨论】:

    • 您还必须按住 ctrl 并拖动表格视图到黄色视图控制器图标,然后选择 dataSource,然后选择 delegate
    【解决方案3】:

    我也是 iOS 新手,但值得这样做:

    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
    

    prepareForSegue 为我工作。谢谢,我想弄清楚如何获取当前选定的行...

    我不确定你所说的“我在 IB 中构建了一个视图控制器,里面有一个 tableview”是什么意思,但听起来你的 segue 源是UIViewController,而不是UITableViewController?您的类需要继承 UITableViewController 才能使 tableView 存在。

    【讨论】:

    • 感谢您的回复,我已经修改了我的原始问题以包含更多详细信息和我正在遵循的教程,这可能会使事情更清楚,因为现在对我来说就像 MUD :/
    【解决方案4】:

    之后:

    DetailViewController *detail = [segue destinationViewController];
    

    输入:

    [detail view];
    

    然后:

    detail.primary = [datasource objectAtIndex:selectedIndexPath.row];
    
    detail.seconday = [datalist objectForKey:detail.primary];
    

    出于某种原因,仅设置 segue 不足以正确设置所有属性。您必须在destinationViewController 上添加呼叫视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2013-05-26
      • 2012-07-28
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多