Как открыть модальное представление без потери данных в целевом контроллере? - PullRequest
0 голосов
/ 02 февраля 2012

Проблема в том, что я понятия не имею, как я могу сохранить полученные данные контроллера после их нажатия или представления в модальном виде.Я использую раскадровку, ARC, iOS5.Когда проект использовал Xib, все работало нормально.У меня есть UIWebView в целевой ViewController, и мне нужно, чтобы открыть переданный URL для аутентификации OAuth в Twitter.Вот код TweetViewController, откуда я вызываю функцию WebViewController.Затем я пытаюсь представить UIViewController, где находится UIWebController.Но после того, как я передаю URL, он забывает эти данные.Поэтому в функции ViewDidLoad NSURL имеет значение null.

// TweetViewController.h
#import <UIKit/UIKit.h>
#import "RSTwitterEngine.h"
#import "WebViewController.h"

@interface TweetViewController : UIViewController <RSTwitterEngineDelegate, WebViewControllerDelegate>

@property (strong, nonatomic) RSTwitterEngine *twitterEngine;
@property (strong, nonatomic) WebViewController *leWebView;

@property (unsafe_unretained, nonatomic) IBOutlet UITextView *textView;
@property (unsafe_unretained, nonatomic) IBOutlet UIBarButtonItem *sendButton;
@property (unsafe_unretained, nonatomic) IBOutlet UILabel *statusLabel;

- (IBAction)sendTweet:(id)sender;
- (void)swipedRight:(UIGestureRecognizer *)recognizer;

@end

Часть TweetViewController.m, которая отправляет данные URL:

#pragma mark - RSTwitterEngine Delegate Methods

- (void)twitterEngine:(RSTwitterEngine *)engine needsToOpenURL:(NSURL *)url
{
    self.leWebView = [_leWebView initWithURL:url];
    self.leWebView.delegate = self;
    [self performSegueWithIdentifier:@"LeWebSegue" sender:self];      
    //[self presentModalViewController:self.leWebView animated:YES];
}

Итак, вот ключевые части WebViewController:

//  WebViewController.h

#import <UIKit/UIKit.h>

@protocol WebViewControllerDelegate;

@interface WebViewController : UIViewController <UIWebViewDelegate>

@property (retain, nonatomic) NSURL *currentURL;

@property (assign, nonatomic) id <WebViewControllerDelegate> delegate;
@property (retain, nonatomic) IBOutlet UIWebView *leWebView;
@property (retain, nonatomic) IBOutlet UIActivityIndicatorView *leActivityIndicator;

- (id)initWithURL:(NSURL *)url;
- (IBAction)ActionNoMore:(id)sender;
@end

@protocol WebViewControllerDelegate <NSObject>

- (void)dismissWebView;
- (void)handleURL:(NSURL *)url;

@end

и WebViewController.m

#import "WebViewController.h"
#import "AppDelegate.h"

@implementation WebViewController

@synthesize delegate = _delegate;
@synthesize currentURL = _currentURL;
@synthesize leWebView = _leWebView;
@synthesize leActivityIndicator = _leActivityIndicator;

#pragma mark - Initialization
// ======= Here is that function which recieves url ========
- (id)initWithURL:(NSURL *)url
{
    self = [self.storyboard instantiateViewControllerWithIdentifier:@"WebView"];
    NSLog(@"WebViewController initWithURL called. Recieved url = %@", url);

    if (self) {
        self.currentURL = url;
        self.delegate = nil;
    }

    return self;

}

#pragma mark - View Lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"WebViewController viewDidLoad called. currentURL = %@", self.currentURL);

    self.leWebView.scalesPageToFit = YES;
    [self.leWebView loadRequest:[NSURLRequest requestWithURL:self.currentURL]];     
}

- (void)viewDidUnload
{
    [self setLeWebView:nil];
    [self setLeActivityIndicator:nil];

    [super viewDidUnload];
}

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

#pragma mark - UIWebView Delegate Methods

- (BOOL)LeWebView:(UIWebView *)LeWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([request.URL.scheme isEqualToString:@"rstwitterengine"] && (self.delegate)) {
        if (self.leActivityIndicator) [self.leActivityIndicator stopAnimating];
        [self.delegate handleURL:request.URL];
        return NO;
    } else {
        return YES;
    }
}

- (void)webViewDidStartLoad:(UIWebView *)LeWebView
{
    if (self.leActivityIndicator) [self.leActivityIndicator startAnimating];
}

- (void)webViewDidFinishLoad:(UIWebView *)LeWebView
{
    if (self.leActivityIndicator) [self.leActivityIndicator stopAnimating];
}

- (void)LeWebView:(UIWebView *)LeWebView didFailLoadWithError:(NSError *)error
{
    if (self.leActivityIndicator) [self.leActivityIndicator stopAnimating];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                    message:[error localizedDescription]
                                                   delegate:nil
                                          cancelButtonTitle:@"Dismiss"
                                          otherButtonTitles:nil];
    [alert show];
}

#pragma mark - Custom Methods


- (IBAction)ActionNoMore:(id)sender {
    if (self.delegate) [self.delegate dismissWebView];

}
@end

Вообще, когда я пытаюсь загрузить это представление, я получаю сообщения журнала, которые WebViewController viewDidLoad вызвал.currentURL = (ноль)

1 Ответ

1 голос
/ 02 февраля 2012

Что-то, что я заметил, это то, что вы вызываете раскадровку для создания вашего контроллера представления в методе initWithURL.Нормальным способом создания объекта является do alloc, а затем initWithURL.Метод alloc создает объект в памяти, а initWithURL настраивает объект.Если вы вызываете alloc, а затем в своем initWithURL вы вызываете instantiateViewControllerWithIdentifier, вы можете создавать утечку памяти, так как instantiateViewControllerWithIdentifier также выделяет память при ее вызове.Затем вы устанавливаете "self" на другой адрес.

Это может вызвать путаницу при запуске instantiateViewControllerWithIdentifier.Сложно сказать.Вам, вероятно, следует запустить instantiateViewControllerWithIdentifier в родительском контроллере представления, а затем нажать свой контроллер представления и затем задать свой URL, поскольку экземпляры UIWebViews создаются только тогда, когда они отображаются, а не при создании контроллера представления.

HTH

...