使用没有UITabBarController的UITabBar来控制UIWebView

我想使用UITabBar让用户导航一个UIWebView 。 这是可能的,或者我会更好使用UIToolbar ? 如果使用UIToolbar更好,我将如何模拟button的“选定”可视状态, UITabBar本身的方式?

没有UITabBarController的UITabBar来控制UIWebView

我提供了Objective-C以及Swift版本来解决这个问题。 你唯一需要做的就是在一个类上实现UITabBarDelegate协议。 它不一定是ViewController,但在这个简单的例子)。

Xcode 5中的Objective-C解决scheme

在这个Objective-C示例中,您可以在UITabBar中的三个search引擎之间切换。

首先,您必须设置您的视图,如下所示:(除非先将UITabBarDelegate添加到ViewController,否则请不要设置委托出口,请参阅代码)

在这里输入图像说明

现在因为你没有直接引用UITabBar中的项目,因为我们在Interface Builder中设置了所有项目,所以你需要在它们上面设置标签。 我不是这种方法的巨大的风扇,但如果你照顾它的工作就好了。 如果你想用dynamic加载button设置更复杂的东西,你应该考虑UITabBar的子类化。

在这里输入图像说明

现在重要的是在右边的“标签”设置。 你需要为每个button设置一个数字。 在这种情况下,我将它们设置为0,1和2,因为这或多或less与数组的数量有关,但您可以自由select任何数字。

设置完成后,我们可以看看代码:

.h文件:

 #import <UIKit/UIKit.h> @interface LVDViewController : UIViewController<UITabBarDelegate> // implementing the delegate allows you to drag and drop the delegate reference from the first screenshot @property (weak, nonatomic) IBOutlet UIWebView *webView; @property (weak, nonatomic) IBOutlet UITabBar *tabBar; @end 

.m文件:

 #import "LVDViewController.h" @interface LVDViewController () @end @implementation LVDViewController - (void)viewDidLoad; { [super viewDidLoad]; // Set the first item as selected. It will automatically load Google [self tabBar:self.tabBar didSelectItem:[self.tabBar.items firstObject]]; self.tabBar.selectedItem = [self.tabBar.items firstObject]; // This is optional } - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item; { NSString *searchEngineURLString = nil; switch (item.tag) { case 0: searchEngineURLString = @"https://google.com"; break; case 1: searchEngineURLString = @"https://duckduckgo.com"; break; case 2: searchEngineURLString = @"https://bing.com"; break; } [self loadSearchEngine:searchEngineURLString]; } - (void)loadSearchEngine:(NSString *)searchEngineURLString; { NSURL *searchEngineURL = [NSURL URLWithString:searchEngineURLString]; NSURLRequest *searchEngineRequest = [NSURLRequest requestWithURL:searchEngineURL]; [self.webView loadRequest:searchEngineRequest]; } @end 

Xcode 6中的Swift解决scheme

现在我们有了Objective-C的版本,这是Swift版本的时间。 首先,我们再次在界面生成器中设置视图,这次Bing是最受欢迎的search引擎,而不是Google来反映新的Apple视angular。 这几乎是相同的,你也必须再次将标签添加到标签栏项目。

在这里输入图像说明

我们有我们的视图控制器了,但现在我们正在使用Swift,所以它只有一个文件:

 import UIKit class ViewController: UIViewController, UITabBarDelegate { @IBOutlet var tabBar : UITabBar @IBOutlet var webView : UIWebView override func viewDidLoad() { super.viewDidLoad() loadSearchEngine("https://www.bing.com") tabBar.selectedItem = tabBar.items[0] as UITabBarItem; } func tabBar(tabBar: UITabBar!, didSelectItem item: UITabBarItem!) { var searchEngineURLString: NSString! = ""; switch item.tag { case 0: searchEngineURLString = "https://www.bing.com" break case 1: searchEngineURLString = "https://www.duckduckgo.com" break case 2: searchEngineURLString = "https://www.google.com" break default: searchEngineURLString = "https://www.bing.com" break } loadSearchEngine(searchEngineURLString); } func loadSearchEngine(searchEngineURLString: NSString!) { var searchEngineURL = NSURL(string: searchEngineURLString) var searchEngineURLRequest = NSURLRequest(URL: searchEngineURL) webView.loadRequest(searchEngineURLRequest) } } 

使用用户在应用程序中熟悉的平台风格是一件好事,但是如果您希望在放置事物的位置以及设置层次结构方面有更大的灵活性,则可以直接使用UITabBar,然后单独实现UITabBarDelegate。

https://developer.apple.com/library/ios/documentation/uikit/reference/UITabBar_Class/Reference/Reference.html#//apple_ref/doc/c_ref/UITabBar

我一直主张不要使用UITableViewController和其他专门的ViewController,比如UITabBarController,因为分离所有东西可以避免混乱,使你的应用程序更加灵活。

根据苹果公司的文档 , UITabBar并不是为了像UIWebView这样的单个视图UIWebView ,而是在不同的视图之间导航。 所以最好使用UIToolBar来代替。

我不得不在viewDidLoad()函数中添加委托的参考:

 self.tabBar.delegate = self 

否则,函数func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem)永远不会被调用。