Открыть веб-страницу в UIWebView после нажатия на кнопку

#ios #objective-c #uiwebview #uibutton

#iOS #objective-c #uiwebview #uibutton

Вопрос:

Мне нужна помощь. У меня есть две кнопки, и мне нужна каждая кнопка, чтобы открыть другую веб-страницу в моем UIWebView (например: кнопка 1 открыть веб-сайт apple.com , кнопка 2 открыта google.com ). Я не могу найти ни одного руководства, которое помогло бы мне. Спасибо за помощь (я использую раскадровку).

Есть мой код, но что-то не так, потому что я вижу только черный экран (после нажатия на кнопку)

TabulkaViewController.m

     UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    myButton.frame = CGRectMake(10, 240, 300, 35);
    [myButton setTitle:@"Buttonone" forState:UIControlStateNormal];
    [myButton addTarget:self action:@selector(myButtonClick:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview: myButton];
}
-(void) myButtonClick:(NSString *)myString
{   
    NSURL *url = [NSURL URLWithString:@"http://www.apple.com/"];
    WebViewController *viewWeb = [[WebViewController alloc] initWithURL:url andTitle:@"Apple"];
    [self presentViewController:viewWeb animated:YES completion:nil];

}
  

WebViewController.h

 #import <UIKit/UIKit.h>

@interface WebViewController : UIViewController <UIWebViewDelegate>
{
NSURL *theURL;
NSString *theTitle;
IBOutlet UINavigationItem *webTitle;
}
- (id)initWithURL:(NSURL *)url;
- (id)initWithURL:(NSURL *)url andTitle:(NSString *)string;
@property (strong, nonatomic) IBOutlet UIWebView *viewWeb;
@end
  

WebViewController.m

 #import "WebViewController.h"
@implementation WebViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    webTitle.title = theTitle;
    NSURLRequest *requestObject = [NSURLRequest requestWithURL:theURL];
    [_viewWeb loadRequest:requestObject];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
- (id)initWithURL:(NSURL *)url andTitle:(NSString *)string {
    if( self = [super init] ) {
        theURL = url;
        theTitle = string;
    }
    return self;
}
-(id)initWithURL:(NSURL *)url {
    return [self initWithURL:url andTitle:nil];
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    _viewWeb.delegate = nil;
    [_viewWeb stopLoading];
}
@end
  

Комментарии:

1. Мне кажется, что вы на самом деле не добавляете webview в качестве subview где угодно? Вы загружаете запрос, но не отображаете его на экране.

2. Он, используя presentViewController:анимированный: завершение:

Ответ №1:

При работе с раскадровкой было бы полезно, если бы вы где-нибудь загрузили файл своего проекта.

Но, исходя из опыта, вам необходимо установить делегат WebView для вашего класса WebViewController

вы можете сделать это, добавив это в свой viewDidLoad:

 self.webView.delegate = self;
  

затем вы должны реализовать вызов делегата shouldStartLoadWithRequest, это хорошее начало.

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{ 
    return YES;
}
  

дайте мне знать, если это исправит проблему.

РЕДАКТИРОВАТЬ: после проверки вашего проекта измените WebViewController-> viewDidLoad на это:

 - (void)viewDidLoad
{
    [super viewDidLoad];
    // init webview
    _viewWeb = [[UIWebView alloc] initWithFrame:self.view.frame];

    _viewWeb.delegate = self;

    // add it to this controller's view
    [self.view addSubview:_viewWeb];

    webTitle.title = theTitle;
    NSURLRequest *requestObject = [NSURLRequest requestWithURL:theURL];

    [self.viewWeb loadRequest:requestObject];
}
  

ваш _viewWeb не был инициализирован, как я подозревал, см. Мои Комментарии о том, как его инициализировать и как добавить его в ваш WebViewController

EDIT2: добавлены ограничения для полноэкранного просмотра веб-страниц, я рекомендую вам ознакомиться с автоматической компоновкой в документах Apple

 - (void)viewDidLoad
{
    [super viewDidLoad];
    // init webview
    _viewWeb = [[UIWebView alloc] initWithFrame:self.view.frame];

    _viewWeb.delegate = self;

    // add it to this controller's view
    [self.view addSubview:_viewWeb];


    // add constraints
    NSDictionary* dict = @{@"viewWeb":_viewWeb};
    _viewWeb.translatesAutoresizingMaskIntoConstraints = NO;
    NSArray* constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[viewWeb]-0-|" options:0 metrics:nil views:dict];
    [self.view addConstraints:constraints];
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[viewWeb]-0-|" options:0 metrics:nil views:dict];
    [self.view addConstraints:constraints];

    webTitle.title = theTitle;
    NSURLRequest *requestObject = [NSURLRequest requestWithURL:theURL];

    [self.viewWeb loadRequest:requestObject];
}
  

Комментарии:

1. Когда я использую self.viewWeb = self; в WebViewController (в viewDidLoad), у меня появляется предупреждение: несовместимые типы указателей, присваиваемые UIWebView из WebViewController :/

2. извините, что я виноват, это должно быть: self.WebView.delegate = self, я отредактирую ответ

3. вы добавили _viewWeb в свой просмотр? просмотрите свой код WebViewController->viewDidLoad и убедитесь, что _viewWeb не равен нулю. Если вы можете загрузить свой проект куда-нибудь, я быстро посмотрю и посмотрю, что происходит.

4. Я могу отправить вам проект завтра, хорошо?

5. конечно, нет проблем, следуйте за мной в Twitter @mikeMTOL, и я отправлю вам свой адрес электронной почты.