iPhone ViewController влияет на IBOutlet другого ViewController - PullRequest
0 голосов
/ 15 декабря 2009

У меня есть два контроллера представления: TableViewController (который используется в качестве модального контроллера представления) и ToolbarController. В Интерфейсном Разработчике у меня есть ToolbarView, который управляется ToolbarController.

Панель инструментов имеет IBOutlet UIWebView, которым управляет панель инструментов (использует кнопки на панели инструментов для переключения страниц в веб-представлении).

Что мне нужно, так это возможность иметь TableViewController для изменения UIWebview в ToolbarView.

Как мне это сделать?

TableViewController.h:

#import <UIKit/UIKit.h>
#import "ToolbarController.h"
#import "MyAppDelegate.h"


@interface TableViewController : UITableViewController {
    NSMutableArray *widgetList;
    IBOutlet UIWebView *webView;
}

@property(nonatomic,retain) IBOutlet UIWebView *webView;

@end

TableViewController.m:

    #import "TableViewController.h"
    #import "MyAppDelegate.h"
    #import "ToolbarController.h"
    #import "TableView.h"

    @implementation TableViewController

    @synthesize webView;

    //Lots of working code omitted
//didSelectRowAtIndex below should change the webView in ToolbarView to Google's homepage but does not.

        - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
            NSString *urlAddress=[NSString stringWithFormat:@"http://www.google.com"];
            NSURL *url = [NSURL URLWithString:urlAddress];
            NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
            [webView loadRequest:requestObj];
            [self dismissModalViewControllerAnimated:YES];
        }

        - (void)viewDidUnload {
            // Release any retained subviews of the main view.
            // e.g. self.myOutlet = nil;
        }


        - (void)dealloc {
            [super dealloc];
        }


        @end

Ответы [ 2 ]

2 голосов
/ 15 декабря 2009

Я бы предложил использовать делегирование для решения этой задачи. Установите протокол делегата, такой как URLSelectionDelegate, который будет реализован вашим контроллером представления панели инструментов. Вам, вероятно, просто понадобится один метод, такой как -urlSelectionDelegateDidSelectItemWithURL:(NSString *)selectedItemURL или подобный. Таким образом, ваш модальный контроллер табличного представления отвечает только за своего родителя, когда элемент был выбран, и вы сохраняете всю свою UIWebView связанную логику в том же месте, в контроллере представления панели инструментов.

Вы должны объявить протокол делегата в его собственном файле или просто в заголовке контроллера вашей панели инструментов, например:

@protocol URLSelectionDelegate <NSObject>
- (void)urlSelectionDelegateDidSelectItemWithURL:(NSString *)selectedItemURL;
@end

Ваш контроллер веб-просмотра затем реализует этот протокол URLSelectionDelegate, что означает, что он реализует метод urlSelectionDelegateDidSelectItemWithURL::

@interface TableViewController : UITableViewController <URLSelectionDelegate>
// ...
@end

Теперь вы добавите свойство к вашему контроллеру модального табличного представления с именем «Delegate» или «urlSelectionDelegate»:

@property (nonatomic, assign) id<URLSelectionDelegate> delegate;

и установите его для родительского контроллера представления при его инициализации:

// Initialize table view controller (keep your existing code)
TableViewController *vc = [[TableViewController alloc] init];
// Assign the delegate
[vc setDelegate:self];

Теперь, в вашем методе didSelectRowWithIndexPath, вы будете вызывать метод делегата соответственно:

if ([self delegate] != nil && [[self delegate] respondsToSelector:@selector(urlSelectionDelegateDidSelectItemWithURL:)) {
  [delegate urlSelectionDelegateDidSelectItemWithURL:@"http://www.google.com/";
}

Затем просто поместите логику, чтобы изменить веб-представление внутри родительского контроллера представления.

Вы можете прочитать намного больше о своих различных параметрах в "Каков наилучший способ связи между контроллерами представления?" и вы можете узнать больше о шаблоне делегирования в Objective- C в Как создать делегатов в Objective-C?

0 голосов
/ 15 декабря 2009

Является ли webView инициализированным в ToolbarView? Обычно я делаю это, добавляя собственный метод init в TableViewController, который передает ссылку на этот объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...