изменение текста UILabel в подвиде из основного вида

Итак, я относительный новичок в программировании на Objective-C/iOS, поэтому, надеюсь, кто-нибудь с большим знанием здесь сможет мне помочь.
У меня есть приложение для iPad, использующее шаблон SplitViewController (с Core Data). Я создал еще один UIViewController (с файлом xib) с именем PlayerViewController. В этом представлении есть несколько компонентов UILabel.

У меня есть список игроков, которые отображаются в RootViewController (UITableView), и когда вы выбираете игрока, я программно создаю PlayerViewController (в DetailViewController), передаю ему NSManagedObject, который был передан в DetailViewController, попробуйте установить текст одного меток в представлении PlayerViewController, а затем добавьте его в качестве подпредставления в DetailViewController.

Все это отлично работает, за исключением установки текста метки в представлении PlayerViewController. Я не уверен, что я делаю неправильно. Я использовал NSLog, чтобы подтвердить, что NSManagedObject не равен нулю и что свойство NSManagedObject, которое я пытаюсь использовать, имеет правильный текст.

Я в недоумении. Любая помощь будет принята с благодарностью. (код следует):

Этот метод находится в файле DetailViewController.m:

- (void)configureView {
    // Update the user interface for the detail item.
    PlayerViewController *player = [[PlayerViewController alloc] init];
    player.player = detailItem;
    [self.view addSubview:player.view];
}

Этот метод вызывается, когда пользователь выбирает элемент из RootViewController (эта функциональность, вызов configureView, настраивается шаблоном, и я не изменил ее).

Установка свойства player PlayerViewController в объект detailItem обрабатывается в методе setPlayer этого класса.

- (void)setPlayer:(NSManagedObject *)managedObject {

    if (player != managedObject) {
        [player release];
        player = [managedObject retain];

        // Update the view.
        [self configureView];
    }
}

Затем у меня есть метод configureView в PlayerViewController, который устанавливает текст метки:

- (void)configureView {
    nickName.text = [[player valueForKey:@"Nickname"] description];
    NSLog(@"Nickname %@", [[player valueForKey:@"Nickname"] description]);
    NSLog(@"Nickname %@", nickName.text);
}   

Итак, первый оператор NSLog печатает желаемое значение, но текст UILabel (называемый nickName) возвращает nil.

Ниже приведены полные файлы PlayerViewController.h и .m:

PlayerViewController.h:

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>


@interface PlayerViewController : UIViewController {

    NSManagedObject *player;

    IBOutlet UILabel *nickName;
    IBOutlet UILabel *goalCount;
    IBOutlet UILabel *assistCount;
    IBOutlet UILabel *timeInGame;
}

@property (nonatomic, retain) IBOutlet UILabel *nickName;
@property (nonatomic, retain) IBOutlet UILabel *goalCount;
@property (nonatomic, retain) IBOutlet UILabel *assistCount;
@property (nonatomic, retain) IBOutlet UILabel *timeInGame;

@property (nonatomic, retain) NSManagedObject *player;

@end

PlayerViewController.m:

#import "PlayerViewController.h"


@implementation PlayerViewController

@synthesize nickName, goalCount, assistCount, timeInGame, player;

#pragma mark -
#pragma mark Managing the detail item

/*
 When setting the player item, update the view 
 */
- (void)setPlayer:(NSManagedObject *)managedObject {

    if (player != managedObject) {
        [player release];
        player = [managedObject retain];

        // Update the view.
        [self configureView];
    }
}       

- (void)configureView {
    nickName.text = [[player valueForKey:@"Nickname"] description];
    NSLog(@"Nickname %@", [[player valueForKey:@"Nickname"] description]);
    NSLog(@"Nickname %@", nickName.text);
}

/*
 // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        // Custom initialization
    }
    return self;
}
*/

/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
}
*/



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    return YES;
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}


- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


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


@end

Я уверен, что просто упустил что-то тривиальное, но я не могу понять это и не смог найти ответы в Интернете.

Спасибо за любую помощь!


person Shaggy13spe    schedule 15.11.2010    source источник


Ответы (3)


Итак, немного поиграв с этим и поискав вокруг, я получил ответ на свою проблему. Оказывается, весь код, который у меня был, был в порядке, кроме местоположения одного оператора. Мой вызов configureView в PlayerViewController.m должен быть в viewDidLoad(), а не в методе setPlayer(). Теперь все отлично работает.

person Shaggy13spe    schedule 16.11.2010

Измените метод configureView на это:

- (void)configureView {
    nickName.text = (NSString*)[player valueForKey:@"Nickname"];
} 
person MathieuF    schedule 15.11.2010

Да, лучше всего вызывать метод

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self configureView]; 
}
  • (void) setPlayer:(NSManagedObject *)managedObject вызывается перед загрузкой файлов пера.
person Matz    schedule 12.08.2014