2012-08-10 2 views
2

Привет Я пытаюсь перезагрузить мой табличный вид, основанный на двух разных массивах. Какой массив должен быть загружен, определяется элементом управления сегментами в панели навигации. В настоящее время он загружает только первый массив и ничего не происходит, когда нажата кнопка управления сегментом. Ниже мой код любая помощь, почему это не работает, очень ценится. Я также проверил, что мой сегмент IBAction подключен в наконечнике.iOS reload UITableView с использованием UISegmentedControl

MessageViewController.h

#import <UIKit/UIKit.h> 

@interface MessageViewController : UIViewController<UITableViewDelegate> { 
    IBOutlet UISegmentedControl *segmentControl; 
    IBOutlet UINavigationBar *navBar; 
    IBOutlet UITableView *tableView; 
} 

@property (retain, nonatomic) IBOutlet UISegmentedControl *segmentControl; 
@property (retain, nonatomic) IBOutlet UITableView *tableView; 
@property (nonatomic, retain) NSMutableArray *inbox; 
@property (nonatomic, retain) NSMutableArray *sent; 

@end 

MessageViewController.m

#import "MessageViewController.h" 

@interface MessageViewController() <UITableViewDelegate> 

@end 

@implementation MessageViewController 
@synthesize segmentControl; 
@synthesize inbox; 
@synthesize sent; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     self.tabBarItem.title = NSLocalizedString(@"Messages", @"Messages"); 
     self.tabBarItem.image = [UIImage imageNamed:@"mail_2_icon&32"]; 
    } 
    return self; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.tableView.delegate = self; 
    self.inbox = [NSMutableArray arrayWithObjects:@"testing", @"test", @"another", nil]; 
    self.sent = [NSMutableArray arrayWithObjects:@"test", @"another", @"testing", nil]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 

#pragma mark Table view methods 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    if(segmentControl.selectedSegmentIndex == 0){ 
     return [inbox count]; 
    }else if(segmentControl.selectedSegmentIndex == 1){ 
     return [sent count]; 
    }else{ 
     return [inbox count]; 
    } 
} 

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    if(segmentControl.selectedSegmentIndex == 0){ 
     NSString *cellValue = [inbox objectAtIndex:indexPath.row]; 
     cell.textLabel.text = cellValue; 
    }else if(segmentControl.selectedSegmentIndex == 1){ 
     NSString *cellValue = [sent objectAtIndex:indexPath.row]; 
     cell.textLabel.text = cellValue; 
    }else{ 
     NSString *cellValue = [inbox objectAtIndex:indexPath.row]; 
     cell.textLabel.text = cellValue; 
    } 
    return cell; 
} 

-(IBAction)segmenter{ 
    [tableView reloadData]; 
} 

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

} 

- (void)dealloc { 
    [inbox release]; 
    [sent release]; 
    [segmentControl release]; 
    [segmentControl release]; 
    [super dealloc]; 
} 

- (void)viewDidUnload { 
    [self setSegmentControl:nil]; 
    [segmentControl release]; 
    segmentControl = nil; 
    [super viewDidUnload]; 
} 

@end 
+2

Установите точку останова внутри 'segmenter'. Вы видите, что программа выполняет этот метод? Если да, вы видите разные значения для 'self.segmentControl.selectedSegmentIndex'? –

+1

Почему вам нужен переключатель в 'segmenter', когда все они делают то же самое? А также вы можете вставить некоторые 'NSLog', чтобы посмотреть, что делает программа. – aforaudrey

+0

Вот моя догадка - розетка настроена на элемент кнопки панели, а не сегментированный элемент управления, живущий внутри него. Проверьте навигатор документов, к какому объекту он подключен. – jrturton

ответ

1

Не знаю, почему он не работает, в конце концов все, что я сделал было удалить три класса и переделывать все с выше то код должен быть только что BORKED по пути, но теперь он работает, и я счастливый турист. Не нужно было делегировать делегат, так как все это сделано в nib, поэтому мой оригинальный код работал нормально.

0

Единственная проблема, которую я вижу, что вы используете контроллер с табличном в нем вид, но вы не настраиваете делегат для него в своем viewDidLoad, и вы не выполняете делегирование для своего контроллера представления.

@interface MessageViewController() <UITableViewDelegate, UITableViewDataSource> 

@end 

В viewDidLoad:

self.tableView.delegate = self; 
self.tableView.dataSource = self; 

Также убедитесь, что у вас есть все подсоединили должным образом в IB, как ваш сегментированный контроль и ваш вид таблицы.

EDIT: Я сделал свой собственный тест, как за то, что вы пытаетесь сделать, Here's my own implementation file

+0

Благодарю вас за ответ. Я обновил свой код выше, но он все еще не работает. – GFlam

+0

Хорошо, другое предложение, которое обычно является хорошей практикой. Не вызывайте свои ivars напрямую (tableView.method), но вместо этого используйте методы доступа, которые вы определили self.tableView.method. Также расширьте UITableViewDataSource и установите его. – 8vius

+0

Хорошо, я сделал свой собственный тест и получил его на работу. Когда вы настраиваете IBAction для сегментированного элемента управления, убедитесь, что оно находится в событии Value Changed. – 8vius

0

установить делегат и DataSource методы и принять точку останова, чтобы проверить данные. ваш код правильный.

tableview.delegate=self; 
tableView.datasource=self; 
+0

Я сделал это в nib, соединив представление таблицы с владельцем файла, однако я просто добавил это к моей viewdidload, но все же не работал – GFlam

+0

if (segmentControl.selectedSegmentIndex == 0) { cell.textLabel.text = [inbox objectatIndex: IndexPath.row]; попробуй... – Bajaj

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