Swift Segue不';我不能在macOS工作
我在Swift Segue不';我不能在macOS工作,swift,macos,segue,swift4,viewcontroller,Swift,Macos,Segue,Swift4,Viewcontroller,我在ViewController中有NSSlider,它必须通过类型为Show的序列将整数值传递给SecondViewController,并在每次移动视图时更新视图。所以,移动滑块我在SecondViewController的窗口中交互地洗牌图像 我花了一个星期的时间试图实现这样一个NSSlider行为,但失败了。也许我在Interface Builder中建立了错误的连接。我不知道。如果您知道任何其他方法使NSSlider用于洗牌图像,请告诉我 有关详细信息,请参阅更新的答案 非常感谢您的帮
ViewController
中有NSSlider
,它必须通过类型为Show
的序列将整数值传递给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
}
}
}
}
}
import Cocoa
class SecondViewController: NSViewController {
var imagesQuantity: Int = 1
override func viewWillAppear() {
super.viewWillAppear()
print(imagesQuantity)
}
}
SecondViewController
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
}
}
}
}
}
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)
}
}
}
视图控制器
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)
}
}
}
第二视图控制器
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)
}
}
}
应该是
@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
}
}
}
因为你有一个方法在另一个里面,而它们应该是一个接一个的
现在,您需要修改passData(\u sender:)
。您需要在内部调用performsgue(带有标识符:sender)
。If将在某个点触发
准备(发件人:)
。我之所以说“某个时刻”,是因为在调用prepare(for:sender:)
之前至少有一个shouldPerformSegue(带标识符:sender:)
调用
那么现在就做:
@IBAction func passData(_ sender: NSSlider) {
self.performSegue(withIdentifier: "SegueIdentifierForSecondVC" sender:nil)
}
应该是
@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
}
}
}
因为你有一个方法在另一个里面,而它们应该是一个接一个的
现在,您需要修改passData(\u sender:)
。您需要在内部调用performsgue(带有标识符:sender)
。If将在某个点触发
准备(发件人:)
。我之所以说“某个时刻”,是因为在调用prepare(for:sender:)
之前至少有一个shouldPerformSegue(带标识符:sender:)
调用
那么现在就做:
@IBAction func passData(_ sender: NSSlider) {
self.performSegue(withIdentifier: "SegueIdentifierForSecondVC" sender:nil)
}
代码中没有错误 您必须将segue连接到
视图控制器
,而不是窗口控制器
将滑块动作连接到iAction
(不连接到segue)和ViewController
至SecondViewController
(不从滑块)的segue
如果第二个视图控制器的类别为SecondViewController
,则应在窗口控制器中指示。SecondVC
来自哪里
再次建议创建NSStoryboardSegue.Identifier的扩展
extension NSStoryboardSegue.Identifier {
static let secondVC = NSStoryboardSegue.Identifier("SegueIdentifierForSecondVC")
}
并在这两种方法中使用它。并强制施放segue.destinationController
。如果一切都连接好了,它就不能崩溃
@IBAction func segueData(_ sender: NSSlider) {
self.performSegue(withIdentifier: .secondVC, sender: nil)
}
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if let identifier = segue.identifier, identifier == .secondVC {
let secondViewController = segue.destinationController as! SecondViewController
secondViewController.imagesQty = slider.integerValue
}
}
最后,NSImage
获得了自己的初始值设定项,并获得了一个URL
let image = NSImage(contentsOf: photos[i])
代码中没有错误
您必须将segue连接到视图控制器
,而不是窗口控制器
将滑块动作连接到iAction
(不连接到segue)和ViewController
至SecondViewController
(不从滑块)的segue
如果第二个视图控制器的类别为SecondViewController
,则应在窗口控制器中指示。SecondVC
来自哪里
再次建议创建NSStoryboardSegue.Identifier的扩展
extension NSStoryboardSegue.Identifier {
static let secondVC = NSStoryboardSegue.Identifier("SegueIdentifierForSecondVC")
}
并在这两种方法中使用它。并强制施放segue.destinationController
。如果一切都连接好了,它就不能崩溃
@IBAction func segueData(_ sender: NSSlider) {
self.performSegue(withIdentifier: .secondVC, sender: nil)
}
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if let identifier = segue.identifier, identifier == .secondVC {
let secondViewController = segue.destinationController as! SecondViewController
secondViewController.imagesQty = slider.integerValue
}
}
最后,NSImage
获得了自己的初始值设定项,并获得了一个URL
let image = NSImage(contentsOf: photos[i])
为什么func prepare(用于segue:NSStoryboardSegue,sender:NSSlider?
在iAction
方法中?把它放在外面,改为在里面写self.perform(segue:SegueIdentifierForSecondVC sender:slider)
你似乎有一些编码方面的知识。你没看到你在另一个里面有一个方法吗@IBAction func passData({sender:NSSlider){}
和func prepare(对于segue:NSStoryboardSegue,sender:NSSlider?{}
是@IBAction func passData({sender:NSSlider){unc prepare(对于segue:NSStoryboardSegue,sender:NSSlider?{}
,而不是一个接一个?因此,在passData()
中调用performsgue()
,它应该触发prepareforsgue()
(如果它根据文档中的声明具有正确的声明)。为什么func prepare(对于segue:NSStoryboardSegue,发送方:NSSlider?
在iAction
方法中?把它放在外面,改为在里面写self.perform(segue:SegueIdentifierForSecondVC sender:slider)
你似乎有一些编码方面的知识。你没看到你在另一个里面有一个方法吗@IBAction func passData({sender:NSSlider){}
和func prepare(对于segue:NSStoryboardSegue,sender:NSSlider?{}
是@IBAction func passData({sender:NSSlider){unc prepare(对于segue:NSStoryboardSegue,sender:NSSlider?{}
,而不是一个接一个?因此,在passData()
中调用performsgue()
,它应该触发prepareforsgue()
(如果它根据文档中的声明具有正确的声明)。是否调用了prepare(对于segue:sender:)
?对于标识符,这似乎是正确的,只是我更习惯于iOS而不是macOS。什么窗户开着?第二个VC?新的?当您想要更新值时,secondVC是否一直在屏幕上?滑块打开secondVC窗口,并且不更新值(((再次:Isprepare(for segue:sender:)
called?是否可以在其中添加一个print()
?如果调用它,它是在print(imagesQuantity)之前还是之后打印的)
?我想知道功能准备(fo