#iphone #xcode #uitableview #storyboard
#iPhone #xcode #uitableview #раскадровка
Вопрос:
Я видел похожие темы и читал их, но я все еще не могу заставить это работать. Поэтому я решил опубликовать свой код здесь на случай, если кто-нибудь сможет мне помочь в дальнейшем. Я пытаюсь создать tableview внутри ViewController. Я использую Xcode 4.5 и раскадровку.
prodViewController.h
#import <UIKit/UIKit.h>
@interface prodViewController : UIViewController <UITableViewDelegate , UITableViewDataSource>
@property (strong, nonatomic) IBOutlet UIView *prodview;
// properties of ui
@property (strong, nonatomic) IBOutlet UIImageView *image;
@property (strong, nonatomic) IBOutlet UILabel *namelbl;
@property (strong, nonatomic) IBOutlet UILabel *manufactlbl;
@property (strong, nonatomic) IBOutlet UILabel *scorelbl;
@property (strong, nonatomic) IBOutlet UILabel *dscrlbl;
@property (strong, nonatomic) IBOutlet UILabel *videolbl;
// properties of tab bar
@property (strong, nonatomic) IBOutlet UITabBarItem *addfav;
@property (strong, nonatomic) IBOutlet UITabBarItem *compare;
@property (strong, nonatomic) IBOutlet UITabBarItem *more;
// table
@property (strong, nonatomic) IBOutlet UITableView *tableview;
@end
prodViewController.m
#import "prodViewController.h"
@interface prodViewController ()
@end
@implementation prodViewController
@synthesize tableview;
@synthesize prodview;
@synthesize addfav;
@synthesize compare;
@synthesize more;
@synthesize image;
@synthesize namelbl;
@synthesize manufactlbl;
@synthesize scorelbl;
@synthesize dscrlbl;
@synthesize videolbl;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[tableview setDataSource:self];
[tableview setDelegate:self];
}
- (void)viewDidUnload
{
[self setAddfav:nil];
[self setCompare:nil];
[self setMore:nil];
[self setProdview:nil];
[self setTableview:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
@end
Подключения к просмотру таблицы:
Ошибка:
[prodViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x683a5b0
2*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[prodViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x683a5b0'
Новая ошибка:
Если я удалю реализованные табличные методы, чтобы действительными были только реализации раскадровки, я все равно получу эту ошибку:
-[prodViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x6c34c80
Комментарии:
1. вызываете ли вы TableView: numberOfRowsInSection: явно с любого другого контроллера? Почему вы объявили методы источника данных табличного представления в своем заголовочном файле?
2. Нет, пока нет. Но даже если я удалю их, это ничего не изменит @NagaMalleshMaddali
Ответ №1:
Имена методов чувствительны к регистру. Первая часть должна быть tableView:...
( V
заглавной буквой), но у вас все в нижнем регистре: tableview:...
.
Комментарии:
1. Спасибо, я исправил это, и он работает правильно! Но если я удалю реализованные методы в коде, чтобы применялись только изменения раскадровки, я все равно получу ту же ошибку. Почему это?
Ответ №2:
Вам следует избавиться от объявлений метода в файле интерфейса.
Протокол — это все, что необходимо для определения UITableViewDatasource
или UITableViewDelegate
.
Вызываете ли вы эти методы вручную откуда-нибудь в своем проекте? Метод tableView:numberOfRowsInSection:
должен вызываться только tableview. Вы не должны вызывать его самостоятельно.
Редактировать
Кроме того, вам не нужно устанавливать источник данных и делегировать в viewDidLoad
вы уже делаете это в InterfaceBuilder.
Похоже, что здесь вы следуете очень старому руководству. Я бы рекомендовал ознакомиться с более актуальным руководством.
Сайт Рэя Вендерлиха — это всегда хорошее место для начала.
Комментарии:
1. Через interface builder понятия не имею, почему, но это не сработало должным образом.
2. @user3211165 пожалуйста, смотрите ответ Aleksej. Это правильно. Вы использовали a,
v
когда вам нужноV
.3. Я по-прежнему получаю ту же ошибку, когда пытаюсь применить изменения через конструктор интерфейса в раскадровке
4. @user3211165 ПОСМОТРИТЕ на ДРУГОЙ ОТВЕТ. ДРУГОЙ ОТВЕТ ПРАВИЛЬНЫЙ. Это не имеет ничего общего с Interface Builder.
5. @user3211165 Я думаю, вы неправильно понимаете, как работает представление таблицы. Вы не можете предоставить содержимое для табличного представления в построителе интерфейса. Если только вы не используете статическое табличное представление.