我是iOS和Objective-C世界的新手,我想创建一个示例应用程序来学习一些东西但我在程序中发现了一些问题。
我创建了一个带有图书名称的TableViewController,在触摸了一本书后,我希望看到更多有关本书的信息。
所以我创建了book类什么是视图控制器,我在这个类中用一些文本创建了一些标签。
NSLogs工作正常。触摸记录后,从表视图控制器推送到新视图控制器的应用程序变得很好,但我看不到那里的任何内容,而不是顶部的白色bg和后退按钮。
这是书类:
#import "BooksViewController.h"
@interface BooksViewController ()
@end
@implementation BooksViewController
- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
if(self){
self.title = self.bookName;
self.view.backgroundColor = [UIColor whiteColor];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
UILabel *bookNameLabel = [[UILabel alloc] init];
bookNameLabel.text = self.bookName;
bookNameLabel.frame = CGRectMake(10, 10, 300, 50);
[self.view addSubview:bookNameLabel];
UILabel *authorNameLabel = [[UILabel alloc] init];
authorNameLabel.text = self.authorName;
authorNameLabel.frame = CGRectMake(50, 50, 300, 40);
[self.view addSubview:authorNameLabel];
UILabel *bookDescLabel = [[UILabel alloc] init];
bookDescLabel.text = self.bookDesc;
bookDescLabel.frame = CGRectMake(50, 50, 300, 40);
[self.view addSubview:bookDescLabel];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
这是我用来创建图书信息窗口的表视图控制器中的方法:
- (void)viewDidLoad {
[super viewDidLoad];
self.bookNames = @[@"Pan Tadeusz", @"Potop", @"Lalka", @"Uczta dla wron", @"Symfonnia C++"];
self.authorsName = @[@"Adam Mickiewicz", @"Henryk Sienkiewicz", @"Bolesław Prus", @"George R.R Martin", @"Jerzy Greborz"];
self.bookDescs = @[@"Opis Pan Tadeusz", @"Opis Potop", @"Opis Lalka", @"Opis Uczta dla wron", @"Opis Symfonnia C++"];
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Książka na pozycji %ld tapped",indexPath.row);
BooksViewController *bookVC = [[BooksViewController alloc] init];
bookVC.bookName = self.bookNames[indexPath.row];
bookVC.authorName = self.authorsName[indexPath.row];
bookVC.bookDesc = self.bookDescs[indexPath.row];
NSLog(@"Nazwa wybranej książki: %@",bookVC.bookName);
[self.navigationController pushViewController:bookVC animated:YES];
}
答案 0 :(得分:1)
你做错了。
首先,创建一个iVar,它将保存用户选择的Indexpath,为此,只需在.m文件的最顶部添加一个NSIndexPath
变量。
@implementation yourControllerNameHere (){ //In your code you will have your controller name, just add the NSIndexpath ;)
NSIndexPath *selectedPath;
}
然后,当您选择tableview单元格时需要执行segue,为此,请将 - didSelectRowAtIndexPath
方法替换为:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Książka na pozycji %ld tapped",indexPath.row);
selectedPath = indexPath; //We're saving the selected path to our instance variable ! This is very important otherwise we can't find it again.
[self performSegueWithIdentifier:@"fromBooksToDetail"];
}
并在.m文件中添加-prepareForSegue方法;当你第一次创建它时它应该在那里!找到它并添加以下内容
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([segue.identifier isEqualToString:@"fromBooksToDetail"]){
BooksViewController *bookVC =(BooksViewController*)segue.destinationViewController;
bookVC.bookName = self.bookNames[selectedPath.row];
bookVC.authorName = self.authorsName[selectedPath.row];
bookVC.bookDesc = self.bookDescs[selectedPath.row];
NSLog(@"Nazwa wybranej książki: %@",bookVC.bookName);
}
}
现在这不会起作用,除非你在故事板中的两个视图控制器之间添加一个segue链接,所以只需打开你的故事板,并使用右clic或ctrl + left clic ,拖动你的鼠标你的TableViewController到你的BooksController。不要忘记在右侧面板的identifier
中给出正确的Attributes Inspector
!
请注意,我不会那样命名他们; BooksViewController更有意义,如果它是TableViewController
名称,并且" BookDetailViewController
"详情页面。但这只是一个细节。
一旦你拥有了segue链接,performSegue
电话和prepareForSegue
方法,你就会被设置完毕;)
答案 1 :(得分:0)
您需要学习如何调试。尝试将NSLog(@"bookname: %@", self.bookName)
放入viewDidLoad
并查看是否打印任何内容。 (很可能不是)
当您对视图控制器使用alloc init时,我不能100%确定视图生命周期的工作原理。但我的赌注是那里没有设置属性。尝试将bookNameLabel.text = self.bookName;
移至viewWillAppear
而不是viewDidLoad
您应该使用故事板。这非常容易。
此外,您的initWithNibName
永远不会被调用。您正在使用init
- 方法。