Не удается передать имя метки NNString из MasterView в DetailView

63
7

Я пытаюсь сделать приложение Master-Detail, которое отображает список звуков на главном экране. Когда вы нажимаете на звук, вы переходите на экран подробностей, и он отображает звук, который вы выбрали в качестве метки, а затем показывает короткий фильм о звуке. Моя проблема заключается в том, что все звуки отображают как ярлык имя первого звука в списке. Когда я нажимаю "Звук B", на экране подробностей отображается "Звук B." Когда я нажимаю на tSound F, экран подробных данных показывает "Звук B."

Ошибок и предупреждений не возникает. Есть идеи?

Заранее спасибо.

slfViewController.h

#import <UIKit/UIKit.h>

@interface slfViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, strong) IBOutlet UITableView *tableView;

@end

slfViewController.m

#import "slfViewController.h"
#import "slfSoundDetailViewController.h"

@interface slfViewController ()

@end

@implementation slfViewController
{
NSArray *tableData;
NSArray *thumbnails;
}

@synthesize tableView = _tableView;

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
tableData = [NSArray arrayWithObjects:
@"B Sound",
@"Ch Sound",
@"D Sound",
@"F Sound",
...
@"Zh Sound",
nil];

thumbnails = [NSArray arrayWithObjects:
@"b.jpg",
@"ch.jpg",
@"d.jpg",
@"f.jpg",
...
@"zh.jpg",
nil];
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"showSoundDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
slfSoundDetailViewController *destViewController = segue.destinationViewController;
destViewController.soundName = [tableData objectAtIndex:indexPath.row];
}
}

#pragma mark - TableView Data Source methods

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [tableData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"soundCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}

cell.textLabel.text = [tableData objectAtIndex:indexPath.row];
cell.imageView.image = [UIImage imageNamed:[thumbnails objectAtIndex:indexPath.row]];

return cell;
}

@end

slfSoundDetailViewController.h

#import <UIKit/UIKit.h>

@interface slfSoundDetailViewController : UIViewController

@property (nonatomic, strong) IBOutlet UILabel *soundLabel;
@property (nonatomic, strong) NSString *soundName;

@end

slfSoundDetailViewController.m

#import "slfSoundDetailViewController.h"

@interface slfSoundDetailViewController ()

@end

@implementation slfSoundDetailViewController

@synthesize soundLabel;
@synthesize soundName;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
soundLabel.text = soundName;
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

спросил(а) 2021-01-25T21:29:09+03:00 4 месяца, 2 недели назад
1
Решение
125

Вы только устанавливаете soundLabel.text = soundName в viewDidLoad... поэтому его единственное viewDidLoad один раз (когда сначала просматривается представление контроллеров представления). Это приложение, скорее всего, повторно использует один и тот же экземпляр slfSoundDetailViewController поэтому он не перезагружает его представление.

Вероятно, вы захотите переопределить либо -[slfSoundDetailViewController setSoundName:] либо -[slfSoundDetailViewController viewWillAppea:] и установить там soundLabel.text.

ответил(а) 2021-01-25T21:29:09+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема