【问题标题】:Pushing a view controller from a tableview controller doesnt work从 tableview 控制器推送视图控制器不起作用
【发布时间】:2011-10-05 16:58:13
【问题描述】:

我已经设置了一个表格视图控制器并连接了一个子视图,所以当我单击行时,会出现新的子视图。我一步一步地遵循了一些教程,但由于某种原因,当我单击行时没有出现任何内容(尽管正在选择行)。

这是我的主视图控制器:

@interface TableViewsViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

IBOutlet UITableView *tblSimpleTable;
IBOutlet UINavigationBar *navBar;
NSArray *arryData;
NSMutableArray *listOfItems;
}

@property (nonatomic, retain) IBOutlet UITableView *tblSimpleTable;
@property (nonatomic, retain) IBOutlet UINavigationBar *navBar;
@property (nonatomic, retain) NSArray *arryData;
@property (nonatomic, retain) NSMutableArray *listOfItems;

.m(相关部分)

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
}

NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
NSArray *array = [dictionary objectForKey:@"Computers"];
NSString *cellValue = [array objectAtIndex:indexPath.row];
cell.textLabel.text = cellValue;

return cell;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) indexPath 
{

NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
NSArray *array = [dictionary objectForKey:@"Computers"];
NSString *selectedCountry = [array objectAtIndex:indexPath.row];

//Initialize the detail view controller and display it.
DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
dvController.selectedComputer = selectedCountry;
[self.navigationController pushViewController:dvController animated:YES];
dvController = nil;

}

还有子视图控制器:

.h

@interface DetailViewController : UIViewController {

IBOutlet UILabel *lblText;
NSString *selectedComputer;


}

@property (nonatomic, retain) IBOutlet UILabel *lblText;
@property (nonatomic, retain) NSString *selectedComputer;

@end

.m

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.

//Display the selected country.
lblText.text = selectedComputer;

//Set the title of the navigation bar
self.navigationItem.title = @"Selected Computer";

}

我很确定 IB 中的一切都很好。

感谢您的帮助!

【问题讨论】:

  • 在选择一行之前,导航栏是否出现在tableView上方?代码看起来是正确的,所以我会仔细检查连接并确保正确设置了 navigationController。
  • 登录dvController看看是不是nil

标签: iphone objective-c xcode uiviewcontroller uinavigationcontroller


【解决方案1】:

是导航控制器内的表格视图。您可以在

上放置断点
[self.navigationController pushViewController:dvController animated:YES];

并在 self.navigationController 属性中获取战利品。如果它是 nil,你将无法向它推送任何东西,但它不会给你一个错误,因为在大多数情况下,向 nil 发送消息只会返回 nil。

【讨论】:

  • 是的,它是零……我意识到我根本没有定义它……很奇怪。我从一个教程中逐字逐句理解。
  • 很多时候,最让你心烦意乱的是小事。 :)
  • 我看到在很多地方他们在 AppDelegate 中做了一些定义——可以吗?虽然我还是个初学者,但我尽量不要碰这个物体……谢谢!
  • 您的应用程序委托是放置它的可能位置。但更好的解决方案是共享静态对象。因此,您创建了一个具有静态方法 +(MyHolder*) sharedHolder; 的类,并且在该方法中您将创建该类的静态副本,以维护您想要保留的项目。然后,您可能还允许“MyHolder”类从您需要的地方初始化项目(如果它们消失了)。并在收到内存警告时处理内存释放。
  • 请务必覆盖使用共享方法创建的静态变量中包含的类的释放和自动释放方法。这样它就不会无意中被释放
【解决方案2】:

可能有点过头了。如果您从模板创建了DetailedViewController 并检查为它创建一个nib 文件,则nib 文件应该与.h 和.m 文件具有相同的名称。因此,请检查您的 nib 类的名称。应该是:

DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

附:在这里使用self.

self.dvController = nil;

否则会泄露。

【讨论】:

  • 有趣的是,initWithNibName 实际上被设置为另一个名称(就像我说的,我从教程中复制了这个,但是更改了文件名),但是一旦我修复它,它仍然不起作用。跨度>
  • 也泄漏 - 我们还需要 ARC 吗?
猜你喜欢
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
相关资源
最近更新 更多