Отображение свойства объекта в другом классе

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

Спасибо за предложения выше.

Другие вопросы по тегам