Я пытаюсь заполнить UITableView
, что я положил внутри UIViewController
, под в UISegmentedControl
, который изображен на картинке:Наполнение UITableView внутри UIViewController и меняющийся источник данных с UISegmentedControl
После нажав любой из сегментов, я хочу, чтобы UITableView
был заселен другим набором данных. Вот мой соответствующий код:
@interface OTValuesViewController()
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (weak, nonatomic) IBOutlet UISegmentedControl *segmentControl;
@end
@implementation OTValuesViewController
- (IBAction)segmentValueChanged:(id)sender {
UISegmentedControl *segment = self.segmentControl;
UINavigationItem *navItem = self.navigationItem;
UIBarButtonItem *addButton = navItem.rightBarButtonItem;
switch (segment.selectedSegmentIndex) {
case 0:
addButton.action = @selector(addNewVision:);
[self.tableView reloadData];
break;
case 1:
addButton.action = @selector(addNewPurpose:);
[self.tableView reloadData];
break;
case 2:
addButton.action = @selector(addNewPlan:);
[self.tableView reloadData];
break;
default:
[self.tableView reloadData];
break;
}
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UISegmentedControl *segment = self.segmentControl;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"OTValuesTableViewCell" forIndexPath:indexPath];
NSArray *visions = [[OTVisionStore sharedStore] allVisions];
NSArray *purposes = [[OTPurposeStore sharedStore] allPurposes];
NSArray *plans = [[OTPlanStore sharedStore]allPlans];
OTVision *vision = [visions objectAtIndex:indexPath.row];
OTVision *purpose = [purposes objectAtIndex:indexPath.row];
OTVision *plan = [plans objectAtIndex:indexPath.row];
NSString *textLabel = [vision description];
if (segment.selectedSegmentIndex==0) {
textLabel = [vision description];
cell.textLabel.text = textLabel;
}
else if (segment.selectedSegmentIndex==1) {
textLabel = [purpose description];
cell.textLabel.text = textLabel;
}
else{
textLabel = [plan description];
cell.textLabel.text = textLabel;
}
return cell;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
UISegmentedControl *segment = self.segmentControl;
if(segment.selectedSegmentIndex==0) {
return [[[OTVisionStore sharedStore]allVisions]count];
}
else if (segment.selectedSegmentIndex==1) {
return [[[OTPurposeStore sharedStore]allPurposes]count];
}
else{
return [[[OTPlanStore sharedStore]allPlans]count];
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.dataSource = self;
self.tableView.delegate = self;
[email protected]"Mission Statement";
UINavigationItem *navItem = self.navigationItem;
UIBarButtonItem *rbbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
target:self
action:@selector(addNewVision:)];
navItem.rightBarButtonItem = rbbi;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView reloadData];
}
Мой вопрос: когда я построить и запустить проект, все отлично - клетки заполняются в моей вкладке по умолчанию (видение). Когда я нажимаю кнопку UISegmentedControl
, я получаю ошибку:
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
Если удалить:
self.tableView.dataSource = self;
self.tableView.delegate = self;
из моего viewDidLoad
, эта ошибка не происходит (хотя, UITableView
, очевидно, не получают заселена .) Это заставляет меня думать, что ошибка получена из моего заполнения ячеек на основе выделенного сегмента UISegmentedController's
, однако я не знаю, что конкретно вызывает его.
Любая помощь была бы принята с благодарностью!
Это исправило мою проблему отлично! Большое спасибо - я действительно почесываю голову над этим. – ecatalano