如何在segue期间从视图控制器引用tableView

时间:2011-10-28 15:07:07

标签: uiviewcontroller ios5 tableview

我是iOS开发的新手,所以请轻松告诉我:)

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

我想根据所选单元格的索引,使用我的数据源中的数据设置详细页面标签。最初我编写了“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会给任何应用程序更大的灵活性

希望你能提供帮助, 的Izzy

4 个答案:

答案 0 :(得分:9)

我也是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];
    ...
}

答案 1 :(得分:2)

SWIFT 2更新

我"迷上了" tableView作为ViewController中storyboard的插座。

像这样:@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)


    }

希望有所帮助。

答案 2 :(得分:1)

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

NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];

prepareForSegue为我工作。谢谢,我试图找出如何获得当前选定的行...

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

答案 3 :(得分:1)

之后:

DetailViewController *detail = [segue destinationViewController];

投入:

[detail view];

然后:

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

detail.seconday = [datalist objectForKey:detail.primary];

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