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

Добре, така че аз съм сравнително нов с програмирането на Objective-C/iOS, така че се надявам, че някой с повече познания може да ми помогне.
Имам приложение за iPad, използващо шаблона SplitViewController (с основни данни). Създадох друг 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 (наречен псевдоним) връща нула.

По-долу са пълните файлове 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, извикан преди вашите nib файлове да бъдат заредени.
person Matz    schedule 12.08.2014