Swift中自定义init例程的转换



我需要子类化SVModalWebViewController。m (GitHub),它本身是UINavigationController的子类,我将这段代码合并到一个新的应用程序,将完全在Swift中创建。我遇到了几个问题,所以我决定先把这个非常简单的类转换成Swift来调试。

初始化在Swift中与Objective-C有一点不同(阅读更多关于Swift初始化的内容),这就是为什么我在Swift代码中不返回self的原因。

这是原始Obj-C代码(减去实例化barsTintColor的*.h):

#import "SVModalWebViewController.h"
#import "SVWebViewController.h"
@interface SVModalWebViewController ()
@property (nonatomic, strong) SVWebViewController *webViewController;
@end

@implementation SVModalWebViewController
#pragma mark - Initialization

- (id)initWithAddress:(NSString*)urlString {
    return [self initWithURL:[NSURL URLWithString:urlString]];
}
- (id)initWithURL:(NSURL *)URL {
    self.webViewController = [[SVWebViewController alloc] initWithURL:URL];
    if (self = [super initWithRootViewController:self.webViewController]) {
        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                                                    target:self.webViewController
                                                                                    action:@selector(doneButtonClicked:)];
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
            self.webViewController.navigationItem.leftBarButtonItem = doneButton;
        else
            self.webViewController.navigationItem.rightBarButtonItem = doneButton;
    }
    return self;
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:NO];
    self.webViewController.title = self.title;
    self.navigationBar.tintColor = self.barsTintColor;
}
@end

这是类的整个Swift版本(我简化为只有一个init方法,因为我不需要特别使用URL进行初始化):

import UIKit
class SVModalWebViewController: UINavigationController {
    var webViewController: SVWebViewController!
    var barsTintColor: UIColor?
    // This was added because of a compiler error indicating it needed to be added
    init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
    init(address urlString: String!) {
        let url: NSURL = NSURL.URLWithString(urlString)
        self.webViewController = SVWebViewController(URL: url)
        super.init(rootViewController: self.webViewController)
        let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self.webViewController, action: Selector("doneButtonClicked:"))
        if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
            self.navigationItem.leftBarButtonItem = doneButton
        } else {
            self.navigationItem.rightBarButtonItem = doneButton
        }
    }
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        // self.title may not be set, and is considered an optional in Swift, so we have to check first
        if self.title {self.webViewController.title = self.title}
        self.navigationBar.tintColor = self.barsTintColor
    }
}

我遇到的问题涉及在navigationItem中设置Done按钮。当前,当调用

代码时,它们根本不会显示。
let webViewController = SVModalWebViewController(address: "http://www.google.com");
webViewController.barsTintColor = UIColor.blueColor()
self.presentModalViewController(webViewController, animated: true)

模态视图看起来很好,我能够正确设置栏的颜色属性,但Done按钮不显示。看来我没有进入UINavigationControllernavigationItem的权限。注意,由于没有nibName方法的编译器错误,我不得不添加initwithnibname方法。这在objc代码中是不需要的,我承认我不确定为什么在Swift中需要它——这可能是问题的一部分。

关于为什么我不能设置UINavigationControllerself.navigationItem.leftBarButtonItem属性的任何想法?谢谢!

UINavigationController没有navigationItem。是有,但没用。显示在导航栏中的是子控制器的navigationItem(在本例中是rootViewController,也称为self.webViewController)。

最新更新