Swift中利用AppDelegate实现调用指定ViewController中的函数

接着上一篇的Blog讲,在我们自定义了TableViewCell之后,我们可能需要点击cell里面的button等操作,比如点击了以后跳转到别的页面,这个时候,因为跳转动作是在tableview所在的viewcontroller(假设为A类)实现的,所以,我们需要在tablewViewCell类里面调用A类的一个实例,这个实例一般是通过AppDelegate类实现的。

具体来看一下实现过程。

我们先来看一下整体的需求:

在“基站列表”这个ViewController里面,我们的TableViewCell
是自定义的,然后在我们自定义的cell里面,有按钮,我们点击按钮以后,跳转到下一个界面,Segue的identifier是“showInfoForStation”。

很明显,我们的需求是:在cell的类中button的action里面,获取到“基站列表”ViewContrller的一个实例,这个实例有个方法,可以实现界面的跳转。

好了,上代码:

AppDelegate.Swift

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var projectDetail = ProjectDetailViewController()

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        let mainSB = UIStoryboard(name: "Main", bundle: nil)
        self.projectDetail = mainSB.instantiateViewControllerWithIdentifier("projectDetailVC") as! ProjectDetailViewController
        return true

    }

首先声明我们想要的viewController的实例,这里我命名为projectDetail

这里在didFinishLaunchingWithOptions函数里面其实得到的是空,因为ViewController只有在它被调用的时候,才被实例化,也就是viewDidLoad只有在首次调用该界面的时候,才会实例化改类。

所以接下来我们需要在ProjectDetailViewControler类的ViewDidLoad函数中真正把这个viewcontroller的实例赋予AppDelegate

ProjectDetailViewController.swfit

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appdelegate.projectDetail = self
        self.tableView.delegate = self
        self.tableView.dataSource = self
        // remove the blank of the header of the table view, mind the height must be more than 0
        self.tableView.tableHeaderView = UIView(frame: CGRectMake(0, 0, self.tableView.frame.size.width, 0.01))
        // register the custom tableview cell
        var nib = UINib(nibName: "StationTableViewCell", bundle: nil)
        self.tableView.registerNib(nib, forCellReuseIdentifier: "cell")
    }

这里的代码和上一篇blog的代码一样,就不多介绍,关键性的代码就是那两行:

        let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appdelegate.projectDetail = self

同时实现一个methode,用于别的类里面调用改方法可以实现页面的跳转:

    // Methord to show the other VC For the AppDelegate to call
    func showStationDetail()->(){
        self.performSegueWithIdentifier("showInfoForStation", sender: self)
    }

这里的跳转动作和之前在storyBoard里面的segue的indentifier一样,是showInfoForStation

最后,在自定义的cell里面完成button的点击action函数就ok了

StationTableViewCell.swift

    @IBAction func buttonPressed(sender: AnyObject) {
        let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appdelegate.projectDetail.showStationDetail()
    }
时间: 2024-10-23 23:50:59

Swift中利用AppDelegate实现调用指定ViewController中的函数的相关文章

利用Entity Framework修改指定字段中的值

利用Entity Framework修改指定字段中的值一般我们编辑某些模型的时候会用到类似这样的代码: [HttpPost] public ActionResult Edit(Article model) { if (model.Id == 0) { return HttpNotFound(); } using (db) { db.Entry(model).State = EntityState.Modified; db.SaveChanges(); } return RedirectToAct

asp.net中利用JSON进行增删改查中运用到的方法

//asp.net中 利用JSON进行操作, //增加: //当点击"增加链接的时候",弹出增加信息窗口,然后,在窗体中输入完整信息,点击提交按钮. //这里我们需要考虑这些:我会进行异步提交,使用jquery中的方法,$.post("网页名",JSON,callback); //JSON的写法:{"name":name,"id":id},那我们对其进行假设,比方说,表单中的textbox很多,需要我们填写的信息 //也很多,

织梦dedecms 中怎么在首页调用指定单篇文章的body主体内容和简介?

在使用织梦dede建站的过程中,我们通常会在首页或者列表页调用文章内容,官方的做法一 般是调用描述内容,但是调用描述存在相应的缺点:调用的内容有限,默认描述内容较短,并且文章修改后,描述不能自动修改,需要手动修改.下面分享一个可以 实现首页或者列表页调用文章body内容而不是description的方法: {dede:arclist row='1' addfields='body' idlist='18' typeid='1' channelid='1'} [field:body functio

C语言中复数运算及调用blas,lapack中复数函数进行科学计算

C语言中常用的数据类型主要int, float ,double ,char 等,但在科学运算中复数扮演着重要角色.这里讲下C语言中的复数运算以及如何调用blas,lapack库中的复数函数来进行科学计算. 1.C语言中的复数运算. C语言中若要用的复数,需要包含头文件complex.h,下面看看一些基本的例子 #include <stdio.h> #include"complex.h" int main() { complex a, b, c, d, f; a = 1 +

利用Type.InvokeMember调用指定函数

需求:利用反射实现父模块根据参数动态调用三个子模块. /// <summary> /// 加载子模块 /// </summary> /// <param name="assemblyName">子模块程序集名称</param> /// <param name="className">要调用的指定函数所在的程序集函数名</param> private void Load(string assemb

Python中print和input调用了Python中底层的什么方法

print  print() 用 sys.stdout.write() 实现 import sys print('hello') sys.stdout.write('hello') print('new') # 结果: # hello # hellonew 可以看到两者还是有不同的. sys.stdout.write()结尾没有换行,而print()是自动换行的.另外,write()只接收字符串格式的参数. print()能接收多个参数输出,write()只能接收一个参数. input Pyth

使用SqlBulkCopy, 插入整个DataTable中的所有数据到指定数据库中

今天有幸被召回母校给即将毕业的学弟学妹们讲我这两年的工作史,看了下母校没啥特别的变化,就是寝室都安了空调,学妹们都非常漂亮而已..好了不扯蛋了,说下今天的主题吧.这些天我在深度定制语法高亮功能的同时发现了博客园提供的一些有意思的函数,甚至有几个博客园都没用到,我也不知道怎么才能触发那些功能..打开这个js就可以看到很多好用的东西了,虽然写的不怎么样,但是至少有这些功能. ps: 推荐安装一个代码格式化的插件,否则一坨看着蛋疼.比如第一个就是 log,方便调试. http://www.qidian

Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較类似。

闭包是功能性自包括模块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C中的 blocks 以及其它一些编程语言中的 lambdas 比較相似. 闭包能够 捕获 和存储其所在上下文中随意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.Swift会为您管理在 捕获 过程中涉及到的内存操作. 注意:假设您不熟悉 捕获 (capturing) 这个概念也不用操心.后面会具体对其进行介绍. 在Swift函数章节中介绍的全局和嵌套函数实际上也是特殊的

InvocationHandler中invoke()方法的调用问题

转InvocationHandler中invoke()方法的调用问题 Java中动态代理的实现,关键就是这两个东西:Proxy.InvocationHandler,下面从InvocationHandler接口中的invoke方法入手,简单说明一下Java如何实现动态代理的.         首先,invoke方法的完整形式如下: public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {