我遇到了问题 - 我在尝试设置UIWebView.delegate = self时获得了EXC_BAD_ACCESS;
我的代码:
vkLogin.h -
#import UIKit/UIKit.h
@interface vkLogin : UIViewController <UIWebViewDelegate>
{
UIWebView *authBrowser;
UIActivityIndicatorView *activityIndicator;
}
@property (nonatomic, retain) UIWebView *authBrowser;
@property (nonatomic, retain) UIActivityIndicatorView *activityIndicator;
@end
vkLogin.m -
#import "vkLogin.h"
#import "bteamViewController.h"
@implementation vkLogin
@synthesize authBrowser;
- (void) viewDidLoad
{
[super viewDidLoad];
activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activityIndicator.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2);
activityIndicator.autoresizesSubviews = YES;
activityIndicator.hidesWhenStopped = YES;
[self.view addSubview: activityIndicator];
[activityIndicator startAnimating];
authBrowser = [[UIWebView alloc] initWithFrame:self.view.bounds];
authBrowser.delegate = self;
authBrowser.scalesPageToFit = YES;
[self.view addSubview:authBrowser];
NSString *authLink = @"http://api.vk.com/oauth/authorize?client_id=-&scope=audio&redirect_uri=http://api.vk.com/blank.html&display=touch&response_type=token";
NSURL *url = [NSURL URLWithString:authLink];
[authBrowser loadRequest:[NSURLRequest requestWithURL:url]];
}
- (void) webViewDidFinishLoad:(UIWebView *)authBrowser
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Lol" message:@"OLOLO" delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
[alert show];
}
@end
所以,如果我赞成委托字符串 - 一切正常,但我没有收到我的webViewDidFinishLoad事件。
我做错了什么?
答案 0 :(得分:5)
错误不在您发布的代码中。您的僵尸消息说您对vkLogin
的引用不好。因此,您需要查看创建的任何类,并保留对vkLogin
类的引用。
该课程应该像vkLogin *foo = [[vkLogin alloc] init];
更新
根据您的评论,您似乎正在为vkLogin
创建一个本地变量。看到代码创建并使用vkLogin
以及如何调用它将是最有用的。除此之外,这里有一些猜测。
您被称为创建多次vkLogin
并将其添加到子视图的方法。 (每次都会创建一个新实例)。
您可以在删除vkLogin
后进行某种回调。
我的猜测vkLogin
应该是您班级中的property
,而不是本地方法变量。
@proprerty (strong, nonatomic) vkLogin *vk;
在您的.m文件中,您可以将其称为self.vk
,因此您可以创建它并将其添加为子视图,如:
self.vk = [[vkLogin alloc] init];
[self.view addSubview:self.vk];
在旁注中,约定说我们应该使用大写字母来启动类名,因此您可以将类命名为VkLogin
,这样可以轻松区分名为vkLogin
的变量(但在解决问题后担心这一点)