gpt4 book ai didi

ios - NSObject 在 StoryBoard/Interface Builder 中的作用是什么?

转载 作者:行者123 更新时间:2023-11-28 07:41:46 25 4
gpt4 key购买 nike

我目前正在学习一个关于 Swift 中 iOS 测试驱动开发的视频教程类(class),但是在 View Controller 中测试 Table View 时,我卡住了,因为我不明白为什么我们需要 NSObject 在 Interface builder 中,如下图所示:

电影库数据服务继承NSObject类:

enter image description here

MovieLibraryDataService 的类是这样的:

import UIKit

class MovieLibraryDataService: NSObject, UITableViewDataSource, UITableViewDelegate {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}


}

MovieLibraryDataService 类将在 XCTestCase 中使用,如下所示:

@testable import FilmFest
class LibraryViewControllerTests: XCTestCase {

var sut: LibraryViewController!

override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
sut = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LibraryViewControllerID") as! LibraryViewController
_ = sut.view
}

override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}

// MARK: Nil Checks
func testLibraryVC_TableViewShouldNotBeNil() {
XCTAssertNotNil(sut.libraryTableView)
}

// MARK: Data Source
func testDataSource_ViewDidLoad_SetsTableViewDataSource() {
XCTAssertNotNil(sut.libraryTableView.dataSource)
XCTAssertTrue(sut.libraryTableView.dataSource is MovieLibraryDataService)
}

// MARK: Delegate
func testDelegate_ViewDidLoad_SetsTableViewDelegate() {
XCTAssertNotNil(sut.libraryTableView.delegate)
XCTAssertTrue(sut.libraryTableView.delegate is MovieLibraryDataService)
}

// MARK: Data Service Assumptions
func testDataService_ViewDidLoad_SingleDataServiceObject() {
XCTAssertEqual(sut.libraryTableView.dataSource as! MovieLibraryDataService, sut.libraryTableView.delegate as! MovieLibraryDataService)
}



}

和LibraryViewController的定义:

import UIKit

class LibraryViewController: UIViewController {

@IBOutlet weak var libraryTableView: UITableView!
@IBOutlet var dataService: MovieLibraryDataService!

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.libraryTableView.dataSource = dataService
self.libraryTableView.delegate = dataService
}


}

我真的不明白为什么我需要制作那个MovieLibraryDataService

我通常使用:

self.libraryTableView.dataSource = self
self.libraryTableView.delegate = self

但为什么我需要写:

self.libraryTableView.dataSource = dataService
self.libraryTableView.delegate = dataService

最佳答案

MovieLibraryDataService 只是另一个实现了 UITableViewDataSourceUITableViewDelegate 的类,区别在于 Storyboard 实例化了它,而 storyboard-创建的 实例通过IBOutlet @IBOutlet var dataService: MovieLibraryDataService! 绑定(bind)。 Storyboard中的所有对象都是 Storyboard创建的,这就是为什么如果它们没有绑定(bind)到您已经使用的其他变量,则必须将它们绑定(bind)到变量才能使用。

将变量命名为 dataService 只是一种奇特的说法,它应该服务,在本例中为 dataSource and delegate一个 tableView,因为它实现了那些委托(delegate)协议(protocol)。

由于dataService是由storyboard实例化的,你可以尝试将storyboard中的dataService绑定(bind)到tableView。这是可能的,因为您在 Storyboard中有 dataService 引用。这将取代 viewController 中的设置 dataSource and delegate

另一个例子

AppDelegate 也是 Storyboard 中的一个 NSObject 所以 Storyboard 中的 UIApplication/NSApplication 能够引用它来使用,避免了在 Storyboard之外自行设置 AppDelegate。 (否则会很难看,也许那只是 macOS,因为 mac 应用程序必须显示 Menu,即使它是空的。)

关于ios - NSObject 在 StoryBoard/Interface Builder 中的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52037381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com