【发布时间】:2018-03-25 17:07:32
【问题描述】:
我在ViewController 中有NSSlider,它必须通过Show 类型的segue 将整数值传递给SecondViewController,并在每次移动时更新视图。所以,移动滑块我会在SecondViewController 的窗口中交互地洗牌图像。
我花了一周的时间试图实现NSSlider 这样的行为,但我失败了。也许我在 Interface Builder 中建立了错误的连接。我不知道。如果您知道使NSSlider 用于洗牌图像的任何其他方法,请告诉我。
有关详细信息,请参阅更新的答案。
非常感谢任何帮助!!!
视图控制器
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var slider: NSSlider!
@IBAction func passData(_ sender: NSSlider) {
func prepare(for segue: NSStoryboardSegue, sender: NSSlider?) {
if segue.identifier!.rawValue == "SegueIdentifierForSecondVC" {
if let secondViewController = segue.destinationController as? SecondViewController {
secondViewController.imagesQuantity = slider.intValue
}
}
}
}
}
SecondViewController
import Cocoa
class SecondViewController: NSViewController {
var imagesQuantity: Int = 1
override func viewWillAppear() {
super.viewWillAppear()
print(imagesQuantity)
}
}
但它不起作用。我的代码有什么问题?
任何帮助表示赞赏。
更新答案
查看控制器
import Cocoa
extension NSStoryboardSegue.Identifier {
static let secondVC = NSStoryboardSegue.Identifier("SegueIdentifierForSecondVC")
}
class ViewController: NSViewController {
@IBOutlet weak var slider: NSSlider!
@IBAction func segueData(_ sender: NSSlider) {
self.performSegue(withIdentifier: .secondVC, sender: slider)
}
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if segue.identifier! == .secondVC {
if let secondViewController =
segue.destinationController as? SecondViewController {
secondViewController?.imagesQty = slider.integerValue
}
}
}
}
第二视图控制器
import Cocoa
class SecondViewController: NSViewController {
var imagesQty = 30
override func viewWillAppear() {
super.viewWillAppear()
//let arrayOfViews: [NSImageView] = [view01...view12]
let url = URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Desktop/ArrayOfElements")
do {
let fileURLs = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil, options: [.skipsHiddenFiles]).reversed()
let photos = fileURLs.filter { $0.pathExtension == "jpg" }
for view in arrayOfViews {
//"imagesQty" is here
let i = Int(arc4random_uniform(UInt32(imagesQty-1)))
let image = NSImage(data: try Data(contentsOf: photos[i]))
view.image = image
}
} catch {
print(error)
}
}
}
【问题讨论】:
-
为什么
func prepare(for segue: NSStoryboardSegue, sender: NSSlider?)在IBAction方法中?把它放在外面,然后在里面写self.perform(segue: SegueIdentifierForSecondVC sender:slider) -
您似乎对编码有所了解。你没有看到你在另一个里面有一个方法吗?
@IBAction func passData(_ sender: NSSlider){}和func prepare(for segue: NSStoryboardSegue, sender: NSSlider?) {}是@IBAction func passData(_ sender: NSSlider){unc prepare(for segue: NSStoryboardSegue, sender: NSSlider?) {}}而不是一个接一个?所以在passData()调用performSegue()它应该触发prepareForSegue()(如果它具有根据文档中的正确声明)。
标签: swift macos segue swift4 viewcontroller