我是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
答案 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上添加调用视图。