2015-04-14 4 views
0

Моя среда - это Xcode 6.3, цель iOS8.3 для iPad. Я изучаю представление Master-Detail, используя шаблон Xcode. Возникает какая-то странная проблема, когда я пытаюсь установить текст метки в подробном представлении:
Если я поместил оператор, который меняет текст метки в позиции P1, он работает.
Но если я положил оператор в положение P2, это не сработает.Экран не обновляется при изменении текста UILabel

В обоих обстоятельствах detailDescriptionLabel.text был изменен, но только оператор P1 на самом деле обновления экрана. (Я проверил эту функцию configureView() была вызвана как раз)

Может кто-нибудь поможет мне? Большое спасибо.

Ниже приведены мои фрагменты кода:

MasterController.m:

#import "MasterViewController.h" 
#import "DetailViewController.h" 

@interface MasterViewController() 

@property (copy, nonatomic) NSMutableArray *objects; 

@end 

@implementation MasterViewController 

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    self.clearsSelectionOnViewWillAppear = NO; 
    self.preferredContentSize = CGSizeMake(320.0, 600.0); 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"PresidentList" ofType:@"plist"]; 
    NSDictionary *presidentInfo = [NSDictionary dictionaryWithContentsOfFile:path]; 
    self.objects = [NSMutableArray arrayWithArray:[presidentInfo objectForKey:@"presidents"]]; 

    self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Segues 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([[segue identifier] isEqualToString:@"showDetail"]) { 
     DetailViewController *controller = (DetailViewController *)[[segue destinationViewController] topViewController]; 
     controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem; 
     controller.navigationItem.leftItemsSupplementBackButton = YES; 

     //P1 
     //controller.detailItem = (self.objects[indexPath.row])[@"url"]; 
    } 
} 



#pragma mark - Table View 

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.objects.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    cell.textLabel.text = (self.objects[indexPath.row])[@"name"]; 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    //P2 
    //self.detailViewController.detailItem = (self.objects[indexPath.row])[@"url"]; 
} 
@end 

DetailController.m:

#import "DetailViewController.h" 

@interface DetailViewController() 
@property (strong, nonatomic) UIPopoverController *masterPopoverController; 
@end 

@implementation DetailViewController 

#pragma mark - Managing the detail item 

- (void)setDetailItem:(id)newDetailItem { 
    if (_detailItem != newDetailItem) { 
     _detailItem = newDetailItem; 
     // Update the view. 
     [self configureView]; 
    } 
    if (self.masterPopoverController != nil) { 
     [self.masterPopoverController dismissPopoverAnimated:YES]; 
    } 
} 

- (void)configureView { 
    // Update the user interface for the detail item. 
    if (self.detailItem) { 
     self.detailDescriptionLabel.text = self.detailItem; 
    } 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    [self configureView]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Split view 

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc { 
    barButtonItem.title = NSLocalizedString(@"Master", @"Master"); 
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; 
    self.masterPopoverController = pc; 
} 

- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem { 
    [self.navigationItem setLeftBarButtonItem:nil animated:YES]; 
    self.masterPopoverController = nil; 
} 
@end 
+0

Не уверен, в чем вопрос. Вы совершенно справедливо доказали, что позиция P1 правильная, а позиция P2 - неправильная. - Вы можете попробовать зарегистрировать 'self.detailViewController' в позиции P2, чтобы узнать еще больше ... – matt

+0

Фактически, detailViewController довольно прост, здесь я поставил весь файл. Я просто не могу найти ничего экстраординарного. –

ответ

2

Я предполагаю, что вы используете перетекает и это точка с использованием выделенного function (prepareForSegue), предназначенный для инициализации значений ПОСЛЕ того, как представление цели представления было создано.

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

+0

Да, вы правы. Мне просто интересно, изменился ли текст UILabel, не следует ли обновлять представление? –

+0

@ZhuShengqi Только если представление, uilabel в иерархии цикла основного события. Проблема здесь в том, что у вас уже есть контроллер вида, автоматически генерируемый segue, но в позиции P2 вы создаете второй контроллер представления, который никогда не отображается, и вы изменяете это вместо показанного. – jalone

+1

Я вижу вашу точку, большое спасибо. Я должен изучить механизмы, предоставляемые Apple больше :) –

0

Я собираюсь угадать, что self.detailViewController равен нулю. Следовательно, P2 не будет работать.

Сложно сказать, не видя всего кода, но в prepareForSegue, вы можете его назначить.

+0

Я проверил, что это не ноль. Возможно, ввод инициализирующего кода в prepareForSegue() - хорошая идея, мне просто интересно, какая разница в P1 и P2 :) –

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