изменение текста UILabel в подпредставлении из основного вида - PullRequest
3 голосов
/ 15 ноября 2010

Хорошо, я относительный новичок в программировании на 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

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

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

Ответы [ 3 ]

4 голосов
/ 16 ноября 2010

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

0 голосов
/ 12 августа 2014

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

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self configureView]; 
}
  • (void) setPlayer: (NSManagedObject *) managedObject вызывается до загрузки ваших файлов пера.
0 голосов
/ 15 ноября 2010

Измените метод configureView следующим образом:

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