customAlertViewController

customAlertViewController

我正在开发一个基本的警报应用程序。这就是主情节提要的样子

ios - 将值从自定义 View 传递到主 View  Controller -Swift-LMLPHP

我添加了一个自定义视图控制器作为单独的xib文件,如下所示

ios - 将值从自定义 View 传递到主 View  Controller -Swift-LMLPHP
ios - 将值从自定义 View 传递到主 View  Controller -Swift-LMLPHP

这就是界面运行时的样子。 (背景中的主ViewController和背景中的CustomAlertController)

ios - 将值从自定义 View 传递到主 View  Controller -Swift-LMLPHP

它包含一个日期选择器。我的意思是,当用户单击主故事板上的addButton时,customAlertViewController将出现,并且用户可以选择要添加为警报的日期和时间。当用户在customAlertViewController中点击Add时,应该将日期和时间传递回数组并添加到Main Storyboard视图控制器中的tableView中。

这是我到目前为止编写的代码:

表代码的代码

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    let adate = alarmDate[indexPath.row].date
    print(adate)
    cell.textLabel?.text = String(adate)
    return cell
    }

警报类中的代码
import Foundation
class Alarm{
    var date : NSDate
    init (date : NSDate){
        self.date = date
    }
}

中的代码CustomAlertViewController

您不必遍历整个代码。我已经尝试过使用prese for segue,但是当CustomAlertviewcontroller位于另一个Storyboard(?)中时,我想这不是可行的解决方案。

我采取的下一种方法是将日期以某种方式传递给viewDidDisappear方法中的Alarm类的实例,然后将其追加到alarmDate数组(在ViewController中声明)。

这就是我陷入困境的地方。 viewDidDisappear中的print语句向控制台输出1,显然是因为已附加日期。但是,一旦CustomAlertViewController退出并且viewController返回,alarmDate数组就会重置,并且表视图中不会显示任何值。我试图解决此问题,但无济于事。

我意识到,如果在情节提要中使用新的视图控制器代替单独的xib文件,则可以轻松实现相同的结果。
class CustomAlertViewController: UIViewController {
    //MARK: - Properties
    @IBOutlet weak var customAlertView: UIView!
    @IBOutlet weak var alarmPicker: UIDatePicker!
    var destinationDate = NSDate()
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName : nibNameOrNil, bundle : nibBundleOrNil)
        self.modalPresentationStyle = .OverCurrentContext
    }
    convenience init(){
        self.init(nibName : "CustomAlertViewController", bundle: nil)
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("NSCoding not supported")
    }


    //MARK: - Methods
    override func viewDidLoad() {
        super.viewDidLoad()
        print ("View loaded")
        self.customAlertView.layer.borderColor = UIColor.darkGrayColor().CGColor
        self.customAlertView.layer.borderWidth = 2
        self.customAlertView.layer.cornerRadius = 8
        view.backgroundColor = UIColor(white: 1, alpha: 0.7)
        view.opaque = false
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    override func viewDidDisappear(animated: Bool) {
        let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("table") as! ViewController
        let alarm = Alarm( date : destinationDate)
        vc.alarmDate.append(alarm)
//        vc.alarmData.reloadData()
        print(vc.alarmDate.count)
    }
    // MARK: - Navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let destinationVC = segue.destinationViewController as! ViewController
        let alarm = Alarm( date : destinationDate)
        destinationVC.alarmDate.append(alarm)
        destinationVC.alarmData.reloadData()
        print(destinationVC.alarmDate.count)
    }
    //MARK: - Actions
    @IBAction func cancelButton(sender: AnyObject) {
        self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)
    }
    @IBAction func addButton(sender: AnyObject) {
        //Code to correct the time zone difference
        let sourceDate = alarmPicker.date
        let sourceTmeZone = NSTimeZone(abbreviation: "GMT")
        let destinationTimeZone = NSTimeZone.systemTimeZone()
        let sourceOffset = sourceTmeZone!.secondsFromGMTForDate(sourceDate)
        let destinationOffset = destinationTimeZone.secondsFromGMTForDate(sourceDate)
        let interval : Double
        interval = Double(destinationOffset - sourceOffset)
        destinationDate = NSDate.init(timeInterval: interval, sinceDate: sourceDate)

        self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)
    }
}

我缺乏使用Swift的经验,非常乐意提供帮助。
PS我正在使用Swift 2.3

最佳答案

您可以使用一个协议:

protocol DateShare {
    func share(date: NSDate)
}

您可以在任何控制器范围之外的任何地方声明它。
然后您添加一个
delegate: DateShare!

您的CustomAlertVC中的属性。在VC中,当初始化CustomAlert时,添加以下行:
customAlert.delegate = self

当然,您可以在VC中添加符合DateShare协议的扩展名,如下所示:
extension ViewController: DateShare {
    func share(date: NSDate) {
         // do whatever you can for that the date can be displayed in table view
        alarmDates.append(date) // if I understood it all ?
    }
}

最后,您将此行添加到addButton(sender:_)范围中:
@IBOutlet func addButton(sender: UIButton?) {
    // generate inputDate here
    delegate.share(date: inputDate)
}

这应该可以解决问题。

关于ios - 将值从自定义 View 传递到主 View Controller -Swift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40416947/

10-10 03:53