Итак, я относительный новичок в программировании на 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
Я уверен, что просто упустил что-то тривиальное, но я не могу понять это и не смог найти ответы в Интернете.
Спасибо за любую помощь!