1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/chenzm_186-OCBridgeSwiftToCall

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

OCBridgeSwiftToCall: передача данных между OC и Swift

Введение

Данный проект представляет собой обзор различных способов передачи значений между Objective-C (OC) и Swift. В нём рассматриваются такие методы, как передача значений через свойства, использование блоков кода, делегатов и уведомлений.

Если у вас есть вопросы о мосте между OC и Swift, обратитесь к статье «Взаимный вызов OC и Swift» на сайте Gitee.com/chenzm_186/OCBrigdeSwiftDemo.

Проектное введение

    1. Переход между страницами и возврат в Swift.
    1. Наблюдение за уведомлениями, отправленными из Swift в OC.
    1. Обработка уведомлений, полученных из Swift.
    1. Вызов методов делегата из OC в Swift.
    1. Вызов кода блока из Swift в OC.
    1. Передача значений свойств, вызов методов и выполнение блоков кода между OC и Swift.
    1. Передача значений между различными частями Swift.

1. Переходы между страницами в Swift

  1. Использование метода present для перехода на другую страницу:
@objc func btnAction(_ sender:UIButton){
    let subVC  = SubVC();
    self.present(subVC, animated: true) {
        NSLog("👺👺👺:%@", subVC);
    };
    NSLog("👺👺👺:%@____%@",sender,self);
}
  1. Возврат на предыдущую страницу:
self.dismiss(animated: true) {
    NSLog("Возврат");
};

2. Наблюдение за уведомлениями из Swift в OC

  • Отправка уведомления из Swift:
func postNotifition(){
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "XMNotification"), object: "Уведомление метода");
}
  • Получение уведомления в OC:
-(void)addNotification{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notiAction:) name:@"XMNotification" object:nil];
}

-(void)notiAction:(NSNotification *)sender{
    NSLog(@"oc:%@",sender.object);
}

-(void)removeNotification{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"XMNotification" object:nil];
}

3. Обработка уведомлений в Swift

 func postNotifition(){
     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "XMNotification"), object: "Метод уведомления");
 }
 
 @objc func addNotification(){
     NotificationCenter.default.addObserver(self, selector: #selector(notificationAction(_:)), name: NSNotification.Name(rawValue: "XMNotification"), object: nil);
 }
 @objc func removeNotifition() {
     NotificationCenter.default.removeObserver(self);
 }
 
 @objc private func notificationAction(_ noti : Notification){
     let str:String = noti.object as! String;
     print("swift:" + str);
 }

Результат печати уведомлений:

4. Вызов метода делегата из OC в Swift

  • Определение протокола в Swift:
///1、Редактирование протокола
@objc(FourVCDelegate)
protocol FourVCDelegate {
    func backSuperVC(str:String)
}

///2、Определение объекта протокола
@objc var myDelegate:FourVCDelegate?;

///3、Вызов протокола
let str:String = "Метод делегата";
self.myDelegate?.backSuperVC(str: str);
  • Подписание протокола в OC:
///1、Вызов протокола
@interface FirVC ()<FourVCDelegate>

///2、Подписание протокола
-(SecVC *)seVc{
    if (!_seVc) {
        _seVc = [SecVC new];
        _seVc.myDelegate = self;
    }
    return _seVc;
}

///3、Реализация протокола
-(void)backSuperVCWithStr:(NSString *)str{
    NSLog(@"%@", str);
}

Результат вызова метода делегата:

###5. Вызов блока кода из Swift в OC

  • Класс файла OC:
///Определение блока кода
@property(nonatomic,strong)void (^thiBlock)(NSString *str);

///Реализация блока кода
!self.thiBlock?:self.thiBlock(@"Swift вызывает блок кода OC");
  • Файл класса Swift:
let vc  = ThiVC();
///Вызов блока кода
vc.thiBlock = {(str) -> () in
    print("Метод блока");
}

self.present(vc, animated: true, completion: {

});

###6. Передача свойств, вызов методов и блоков кода между OC и Swift

  • Метод класса Swift:
import UIKit

class FourVC: UIViewController {

    ///Массив
    @objc var arr0:NSArray = NSArray()
    
    ///Без параметров без возвращаемого значения
    @objc func swMethod0(){
        print("Без параметров без возвращаемого значения");
    }
    ///С параметрами без возвращаемого значения
    @objc func swMethod1(str: String)  {
        print("С параметрами без возвращаемого значения:\(str)");
    }
    ///С параметрами с возвращаемым значением
    @objc func swMethod2(str: String) -> (String){
        return "С параметрами с возвращаемым значением:" + str;
    }

    /// mark - Блок кода
    /// Без возвращаемых параметров
    @objc func bkBlock0(response:() -> ()){
        response();
    }
    ///Возвращает строку параметра
    @objc func bkBlock1(response:(_ res : String) -> ()) {
        response("Возвращает строку параметра");
    }
    /// Возвращает несколько параметров любого типа
    @objc func bkBlock_2_(response:(_ res : Any,_ res1 : Any) -> ()) {
        response(self.arr0, "Без параметров, возвращает несколько параметров любого типа:");
    }
    ///Передача нескольких параметров и возвращение нескольких параметров любого типа
    @objc func bkBlock3(p1:Any,p2:Any,p3:Any,res:(_ res0 : Any ,_ res1 : Any ,_ res2:Any,_ res3:Any) -> ()) {
        res("Передаёт несколько параметров и возвращает несколько параметров любого типа:\n",p1, p2, p3);
    }
    ///Блок кода с возвращаемым значением
    @objc func bkBlock4(res:() -> ()) -> (String){
        res();
        return "Блок кода с возвращаемым значением"
    }
}
``` ```
bkBlock4(cmdStr: String?, blockProperty: funcBlock) {
    blockProperty("backMsg---by block inside func")
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.yellow
    print("属性传值结果:", self.arr0[0], self.arr0[1], arr0[2])
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.dismiss(animated: true) {}
}

Это похоже на язык Swift.

  • Примечание: в запросе присутствуют фрагменты кода, которые не удалось распознать. Если это ошибка, пожалуйста, отправьте запрос повторно.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/chenzm_186-OCBridgeSwiftToCall.git
git@api.gitlife.ru:oschina-mirror/chenzm_186-OCBridgeSwiftToCall.git
oschina-mirror
chenzm_186-OCBridgeSwiftToCall
chenzm_186-OCBridgeSwiftToCall
master