UITableView/UITabBarController: попытка выяснить способ передачи переменной моему целевому контроллеру при выборе строки

Я использую UITableView, который указывает на UITabBarController для отображения серии UIWebView на этих вкладках.

Я хотел бы определить строку, которая будет использоваться для создания URL-адреса для каждой вкладки на основе выбранного элемента. Проблема, с которой я сталкиваюсь, заключается в том, как передать URL-адрес контроллеру StateTrendViewController.

StateTableViewController.h

#import <UIKit/UIKit.h>

@interface StateTableViewController : UITableViewController
{
    NSArray *StateList;
}

@property (nonatomic, retain) NSArray *StateList;

- (void) buildStateList;

@end

StateTableViewController.m

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

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

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

    NSInteger rowNumber = indexPath.row;
    NSString *stateName = [StateList objectAtIndex:rowNumber];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.textLabel.text = stateName.capitalizedString;

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    NSInteger rowNumber = indexPath.row;
    NSString *stateName = [StateList objectAtIndex:rowNumber];

    [[self.navigationController.viewControllers objectAtIndex:2] setTitle:stateName.capitalizedString];
}

StateTrendViewController.h

    #import <UIKit/UIKit.h>

@interface StateTrendViewController : UIViewController
{
    IBOutlet UIWebView *StateTrendView;
    IBOutlet NSString *ViewURL;
}

@property (nonatomic, retain) UIWebView *StateTrendView;
@property (nonatomic, retain) NSString *ViewURL;

@end

StateTrendViewController.m

    #import "StateTrendViewController.h"

@implementation StateTrendViewController

@synthesize StateTrendView;
@synthesize ViewURL;

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

- (void) viewWillAppear:(BOOL)animated 
{
    NSString *baseURL = @"https://www.google.com/search?q=";
    NSString *state = @"test";

    NSString *fullURL = [baseURL stringByAppendingString:state];
    NSURL *url = [NSURL URLWithString:fullURL];

    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; [StateTrendView loadRequest:requestObj];
}

Мне нужно заменить статическую настройку на строку, переданную контроллеру, используя свойство ViewURL, которое я настроил: NSString *state = @"test";

Я использую раскадровку в своем проекте в Xcode 4.2.1. Как мне передать это строковое значение моему контроллеру?


person Dustin Carpenter    schedule 15.02.2012    source источник


Ответы (2)


Если все, что вы передаете, - это строка, самым простым способом может быть определение свойства в вашем контроллере представления, которое вы представляете, для хранения строки. Я заметил, что у вас уже есть один, определенный *ViewURL, но я не уверен, что это то, что вы настроили для этой конкретной задачи, или оно уже предназначено для чего-то другого.

Основываясь на коде, которым вы поделились, я предполагаю, что в вашем didSelectRowAtIndexPath в вашем контроллере таблицы контроллер, который вы устанавливаете заголовок и, предположительно, позже нажимаете, является экземпляром StateViewController:

[[self.navigationController.viewControllers objectAtIndex:2] setTitle:stateName.capitalizedString];

Если эта строка действительно ссылается на экземпляр StateTrendViewController, вы должны назначить свою строку так же, как вы назначаете заголовок. Это необходимо установить до того, как вы перейдете к новому контроллеру представления (я не вижу этого кода):

[[self.navigationController.viewControllers objectAtIndex:2] setViewURL:@"MyPassedString"] //assign custom property

Когда ваш контроллер представления появится на экране, у него уже будет установлено свойство ViewURL.

Также обратите внимание, что ваш стиль именования для переменных экземпляра не является стандартным соглашением какао, ivars beginLowerCase. Кроме того, это необычно и может не сработать, чтобы поместить контроллер TabBar внутрь существующего навигационного контроллера, предположительно, из контроллера табличного представления внутри существующего навигационного контроллера. Обычно TabBar считается навигационной конструкцией верхнего уровня, и вы можете соответствующим образом переосмыслить свою архитектуру.

person isaac    schedule 15.02.2012
comment
Исаак - Ответ, который вы предоставили, удовлетворяет основной вопрос. Я переоценил настройку приложения и буду использовать другой подход к настройке моего приложения. Я ценю ваши отзывы о соглашениях и архитектуре. - person Dustin Carpenter; 16.02.2012

Вы переопределяете prepareForSegue, более подробная информация здесь

person agilityvision    schedule 15.02.2012
comment
Eric LarsOn - спасибо за дополнительную информацию о Seque's. Я использовал информацию от Исаака и сообщение, которое вы предоставили, чтобы переосмыслить свой подход. Поскольку ваша ссылка указывает на другой вопрос, я счел за лучшее принять ответ isaasc для потомков. +1 за помощь. - person Dustin Carpenter; 16.02.2012