在我的DetailViewController.h中,我已经声明了属性*类型,如下所示:
@interface DetailViewController : UIViewController
@property (strong, nonatomic) NSString *type;
@end
然后我得到了一个ListViewController,它是一个包含TableView的UIViewController。 ListViewController.h如下所示:
@interface ListViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@end
在我的ListViewController.m中我想更改* type a的值我很快切换View(视图切换工作正常)。
我这样做是通过添加以下内容来实现的:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UINavigationController * navigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];
DetailViewController * detailController = [[DetailViewController alloc] init];
detailController.type = @"video";
NSLog(@"Type: %@", detailController.type);
[self.navigationController pushViewController:navigationController animated:YES];
}
当我在这个块/函数的第二行放置一个断点时,我得到了带有* type的detailController。 当我NSLog这几行后,它返回“(null)”。 视图已更改,但未设置类型。
我无法弄清楚我做错了什么? 有人为此解决了这个问题,或者能指出一些我们对此的解释吗?
因为我尝试搜索答案,但找不到与我的问题相同的内容,或者我使用了错误的搜索字词。
答案 0 :(得分:1)
这是为了什么?
UINavigationController * navigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];
为什么要在导航控制器内推送导航控制器?
[self.navigationController pushViewController:navigationController animated:YES];
detailController
未被使用或显示。
请改为尝试:
[self.navigationController pushViewController:detailController animated:YES];
答案 1 :(得分:1)
看看最后一行 - 你告诉导航控制器推动自己!
答案 2 :(得分:1)
在didSelectRowAtIndexPath:
方法中更改以下行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController * detailController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];;
detailController.type = @"video";
NSLog(@"Type: %@", detailController.type);
[self.navigationController pushViewController: detailController animated:YES];
}`
在你的故事板中选择DetailViewController
并将故事板ID作为“DetailController”。确保ListViewController
嵌入UINavigationController
,您可以选择ListViewController
并转到editor->Embed in->Navigation Controller
。请按照以下步骤解决您的问题。
或者您可以将ListViewController中的segue提供给DetailViewController并使用
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSIndexPath *path = [self.tableView indexPathForSelectedRow]; //create tableview outlet
[segue.destinationViewController setType:@"video"];
}
答案 3 :(得分:0)
应该是这样的
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController * detailController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailController"];
detailController.type = @"video";
NSLog(@"Type: %@", detailController.type);
[self.navigationController pushViewController:detailController animated:YES];
}
答案 4 :(得分:0)
导航控制器和alloc-init方法是否都实例化了保存视图控制器??
如果是,请尝试此
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController * detailController = [[DetailViewController alloc] init];
detailController.type = @"video";
NSLog(@"Type: %@", detailController.type);
[self.navigationController pushViewController:detailController animated:YES];
}