Отображение свойства объекта в другом классе
Я пытаюсь отобразить несколько свойств класса объекта, который я создал в другом классе (в DetailView.m), но я пытаюсь выяснить, как именно это сделать. Я пытался найти его, но еще не нашел решение (я очень плохо знаком с целью-c и разработчиком iOS). Я начал с основного приложения Master-View.
У меня успешно есть табличное представление, которое отображает 4 разных игрока, но теперь я хочу, чтобы, когда пользователь нажимает на определенного игрока, он переходил в DetailView, из которого он мог нажимать три кнопки, и имел ярлык, на котором будет отображаться дополнительная информация об игроке.
Player.h:
#import <Foundation/Foundation.h>
@interface Player : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *position;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) NSString *club;
-(NSString *) playerDetail;
@end
Я заполняю некоторые случайные значения в AppDelegate.m:
#import "AppDelegate.h"
#import "MasterViewController.h"
#import "Player.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
Player *player1 = [[Player alloc]init];
player1.name = @"Cristiano Ronaldo";
player1.age = 27;
player1.position = @"Winger";
player1.club = @"Real Madrid";
Player *player2 = [[Player alloc]init];
player2.name = @"Neymar";
player2.age = 21;
player2.position = @"Striker";
player2.club = @"Barcelona";
Player *player3 = [[Player alloc]init];
player3.name = @"Juan Mata";
player3.age = 25;
player3.position = @"Midfielder";
player3.club = @"Manchester United";
Player *player4 = [[Player alloc]init];
player4.name = @"Thiago Silva";
player4.age = 27;
player4.position = @"Center Back";
player4.club = @"PSC";
NSMutableArray *players = [NSMutableArray arrayWithObjects:player1, player2, player3, player4, nil];
UINavigationController *navController = (UINavigationController *) self.window.rootViewController;
MasterViewController *masterController = [navController.viewControllers objectAtIndex:0];
masterController.players = players;
return YES;
}
//Rest of code is the generic boilerplate provided by Xcode
@end
И я пытаюсь отобразить положение игрока, возраст, название клуба, когда нажата любая из соответствующих кнопок. Я пытаюсь обработать это в DetailViewController.m.
DetailViewController.m:
#import "DetailViewController.h"
#import "Player.h"
@interface DetailViewController ()
- (void)configureView;
@end
@implementation DetailViewController
#pragma mark - Managing the detail item
- (void)setDetailItem:(id)newDetailItem
{
if (_detailItem != newDetailItem) {
_detailItem = newDetailItem;
// Update the view.
[self configureView];
}
}
- (void)configureView
{
// Update the user interface for the detail item.
if (self.detailItem) {
self.detailDescriptionLabel.text = [self.detailItem description];
}
}
- (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.
}
- (IBAction)positionInfoButton {
//Stuck here
}
- (IBAction)ageInfoButton {
//Stuck here
}
- (IBAction)clubInfoButton {
//Stuck here
}
Я застрял в методах действия для postionInfoButton и т. Д., И я пытаюсь отобразить положение игроков, когда пользователь нажимает кнопку в detailView. В DetailView.hi объявлено:
IBOutlet UILabel *infoLabel;
Я пытаюсь сделать следующее в positionInfoButton(), чтобы попытаться изменить метку:
infoLabel.text = [NSString stringWithFormat: @"Plays in the position of @%", self.position]
но это не работает. Я не думаю, что могу назвать себя здесь, но я не знаю почему. Есть ли другой способ получить свойство игрока для этого конкретного игрока?
3 ответа
Вам придется использовать подготовиться к Segue, что-то вроде этого,
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Assume self.view is the table view
NSIndexPath *path = [self.tableView indexPathForSelectedRow];
DetailObject *detail = [self detailForIndexPath:path];
[segue.destinationViewController setDetail:detail];
}
прямо перед тем, как сделать segue.destinationViewController, сделайте что-то вроде этого
[detail setPosition: players[indexPathForSelectedRow]objectForKey@"position"];
Что-то вроде этого, убедитесь, что в вашем файле details.h есть переменная NSString *position
Если я правильно понимаю ваши настройки, вы должны иметь доступ к detailItem
свойство, как это:
- (IBAction)positionInfoButton {
infoLabel.text = [NSString stringWithFormat: @"Plays in the position of %@", [self.detailItem position];
}
Обратите внимание, что в строке формата вы использовали @%
как заполнитель - это неправильно, поменяйте местами символы, чтобы получить правильный заполнитель: %@
,
Решение было на самом деле следующим образом:
В DetailViewController.H I пришлось добавить следующее свойство:
@property (strong, nonatomic) Player *detailPlayer;
Метод postionInfoButton делает это:
- (IBAction)positionInfoButton {
infoLabel.text = [NSString stringWithFormat:@"%@", [self.detailPlayer position]];
NSLog(@"Pressed Position button %@", [self.detailPlayer position]);
}
И, наконец, в пределах MasterViewController.m измените метод prepareForSegue() следующим образом:
if ([[segue identifier] isEqualToString:@"showDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
Player *play = _players[indexPath.row];
[[segue destinationViewController] setDetailPlayer:play];
}
Здесь я сделал изменение для создания экземпляра типа Player, а затем вызвал переход, чтобы использовать эту информацию игрока для следующего представления.
Спасибо за предложения выше.