2015-08-18 1 views
0

Я пытаюсь заполнить UITableView, что я положил внутри UIViewController, под в UISegmentedControl, который изображен на картинке:Наполнение UITableView внутри UIViewController и меняющийся источник данных с UISegmentedControl

enter image description here

После нажав любой из сегментов, я хочу, чтобы 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, однако я не знаю, что конкретно вызывает его.

Любая помощь была бы принята с благодарностью!

ответ

1

Проблема в вашем методе cellForRowAtIndexPath. Вы пытаетесь использовать текущий путь указателя для всех ваших массивов, а не только применимый массив. Попробуйте что-то вроде этого:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UISegmentedControl *segment = self.segmentControl; 
    UITableViewCell *cell = [tableView  dequeueReusableCellWithIdentifier:@"OTValuesTableViewCell" forIndexPath:indexPath]; 

    if (segment.selectedSegmentIndex==0) { 
     NSArray *visions = [[OTVisionStore sharedStore] allVisions]; 
     OTVision *vision = [visions objectAtIndex:indexPath.row]; 
     NSString *textLabel = [vision description]; 
     cell.textLabel.text = textLabel; 
    } 
    else if (segment.selectedSegmentIndex==1) { 
     NSArray *purposes = [[OTPurposeStore sharedStore] allPurposes]; 
     OTVision *purpose = [purposes objectAtIndex:indexPath.row]; 
     NSString *textLabel = [purpose description]; 
     cell.textLabel.text = textLabel; 
    } 
    else{ 
     NSArray *plans = [[OTPlanStore sharedStore]allPlans]; 
     OTVision *plan = [plans objectAtIndex:indexPath.row]; 
     NSString *textLabel = [plan description]; 
     cell.textLabel.text = textLabel; 
    } 

    return cell; 
} 
+0

Это исправило мою проблему отлично! Большое спасибо - я действительно почесываю голову над этим. – ecatalano

 Смежные вопросы

  • Нет связанных вопросов^_^