在Swift中的CTCallCenter

4
我正在尝试在Swift中使用CTCallCenter,但它总是显示错误。
我认为这可能是由于闭包的使用方式引起的,但实际上我对它并不熟悉。
有人有解决这个问题的想法吗?
以下是我的代码:
import CoreTelephony

class ViewController: UIViewController{

    var callCenter:CTCallCenter = CTCallCenter()

    override func viewDidLoad() {

           callCenter.callEventHandler(call:CTCall) -> Void in{
                //will get CTcall status here
           }
    }
}

有三个错误。

1、括号内的语句块未使用

2、期望表达式

3、同一行上的连续语句必须用“;”分隔。

我试图按照指示更改,但是任何方式都不正确。

谢谢您提前!


你之所以出现错误是因为你声明的方式不正确。 - Dharmesh Kheni
是的,我知道,但实际上我不知道如何以正确的方式调用“callEventHandler”,即使我看到了参考资料。你知道如何编写CTCall的“callEventHandler”吗? - T.Akashi
2个回答

8
我使用以下代码使其工作:
```` 我使用以下代码使其工作: ````
import CoreTelephony

class SomeClass: UIViewController {

    private var callCenter = CTCallCenter()

    override func viewDidLoad() {
        super.viewDidLoad()

        callCenter.callEventHandler = { (call:CTCall!) in

            switch call.callState {
                case CTCallStateConnected:
                    println("CTCallStateConnected")
                    self.callConnected()
                case CTCallStateDisconnected:
                    println("CTCallStateDisconnected")
                    self.callDisconnected()
                default:
                    //Not concerned with CTCallStateDialing or CTCallStateIncoming
                    break
            }
        }
    }

    func callConnected(){
        // Do something when call connects
    }

    func callDisconnected() {
        // Do something when call disconnects
    }
}

希望这可以帮助到您。

抱歉如果我错了,但我认为这会导致保留循环。为了避免这种情况,我会写成:{ [weak self] (call:CTCall!) in .... self?.callConnected() .... } - Ferran Maylinch

1
Apple文档中:

响应移动电话呼叫事件

当呼叫状态改变时,会触发此事件。

声明:

var callEventHandler: ((CTCall!) -> Void)!

讨论:

此属性的块对象在默认优先级全局调度队列上分派,以响应呼叫状态的更改。 为了处理这样的呼叫事件,请在应用程序中定义一个处理程序块,并将其分配给此属性。 您必须实现处理程序块以支持从任何上下文调用。

如果您的应用程序在呼叫事件发生时处于活动状态,则系统立即将该事件分派到您的处理程序。 但是,在您的应用程序暂停时也可以发生呼叫事件。 在暂停时,您的应用程序不会接收呼叫事件。 当您的应用程序恢复活动状态时,对于每个更改状态的呼叫,它将接收单个呼叫事件-无论呼叫在您的应用程序暂停时经历了多少状态更改。 发送到您的处理程序的单个呼叫事件,在您的应用程序返回活动状态时描述了呼叫的状态。

例如,假设您的应用程序在连接状态下放置呼叫时,从活动状态更改为暂停状态。 进一步假设,在您的应用程序暂停时,呼叫断开连接。 当您的应用程序返回活动状态时,您将收到一个移动电话呼叫事件,指示呼叫已断开。

以下是一个更复杂的示例。 假设用户启动呼叫但尚未连接(即,您的应用程序在拨号状态下挂起)后,您的应用程序从活动状态更改为暂停状态。 进一步假设,在您的应用程序暂停时,呼叫首先更改为连接状态,然后更改为断开连接状态。 当您的应用程序恢复活动状态时,您将收到单个移动电话呼叫事件,指示呼叫已断开。

也许现在你可以理解如何声明它了。

我可以再问一下吗?这意味着该方法的第一行是这样的吗?callEventHandler:{(instance:CTCall!)->Void} 我尝试了一些方法,但是找不到正确的方式... - T.Akashi
你尝试过这个吗?var callCenter: ((CTCall!) -> Void)! - Dharmesh Kheni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接