zoukankan      html  css  js  c++  java
  • (转发)IOS高级开发~Runtime(四)


    用C代替OC:


    #import <objc/runtime.h>

    #import <objc/message.h>

    #import <stdio.h>


    extern int UIApplicationMain (int argc,char *argv[],void *principalClassName,void *delegateClassName);



    struct Rect {

      float x;

      float y;

      float width;

      float height;

    };

    typedef struct Rect Rect;



    void *navController;

    static int numberOfRows =100;




    int tableView_numberOfRowsInSection(void *receiver,structobjc_selector *selector, void *tblview,int section) {

      returnnumberOfRows;

    }


    void *tableView_cellForRowAtIndexPath(void *receiver,structobjc_selector *selector, void *tblview,void *indexPath) {

      Class TableViewCell = (Class)objc_getClass("UITableViewCell");

      void *cell = class_createInstance(TableViewCell,0);

      objc_msgSend(cell, sel_registerName("init"));

      char buffer[7];

      int row = (int) objc_msgSend(indexPath, sel_registerName("row"));

      sprintf (buffer, "Row %d", row);

      void *label =objc_msgSend(objc_getClass("NSString"),sel_registerName("stringWithUTF8String:"),buffer);

      objc_msgSend(cell, sel_registerName("setText:"),label);

      return cell;

    }


    void tableView_didSelectRowAtIndexPath(void *receiver,structobjc_selector *selector, void *tblview,void *indexPath) {

      Class ViewController = (Class)objc_getClass("UIViewController");

      void * vc = class_createInstance(ViewController,0);

      objc_msgSend(vc, sel_registerName("init"));

      char buffer[8];

      int row = (int) objc_msgSend(indexPath, sel_registerName("row"));

      sprintf (buffer, "Item %d", row);

      void *label =objc_msgSend(objc_getClass("NSString"),sel_registerName("stringWithUTF8String:"),buffer);

      objc_msgSend(vc, sel_registerName("setTitle:"),label);

      objc_msgSend(navController,sel_registerName("pushViewController:animated:"),vc,1);

    }


    void *createDataSource() {

      Class superclass = (Class)objc_getClass("NSObject");

      Class DataSource = objc_allocateClassPair(superclass,"DataSource",0);

      class_addMethod(DataSource,sel_registerName("tableView:numberOfRowsInSection:"), (void(*))tableView_numberOfRowsInSection,nil);

      class_addMethod(DataSource,sel_registerName("tableView:cellForRowAtIndexPath:"), (void(*))tableView_cellForRowAtIndexPath,nil);

      objc_registerClassPair(DataSource);

      returnclass_createInstance(DataSource,0);

    }


    void * createDelegate() {

      Class superclass = (Class)objc_getClass("NSObject");

      Class DataSource = objc_allocateClassPair(superclass,"Delegate",0);

      class_addMethod(DataSource,sel_registerName("tableView:didSelectRowAtIndexPath:"), (void(*))tableView_didSelectRowAtIndexPath,nil);

      objc_registerClassPair(DataSource);

      returnclass_createInstance(DataSource,0);

    }




    void applicationdidFinishLaunching(void *receiver,structobjc_selector *selector, void *application) {

      Class windowClass = (Class)objc_getClass("UIWindow");

      void * windowInstance = class_createInstance(windowClass, 0);

        

      objc_msgSend(windowInstance, sel_registerName("initWithFrame:"),(Rect){0,0,320,480});

      

      //Make Key and Visiable

      objc_msgSend(windowInstance,sel_registerName("makeKeyAndVisible"));


      //Create Table View

      Class TableViewController = (Class)objc_getClass("UITableViewController");

      void *tableViewController = class_createInstance(TableViewController, 0);

      objc_msgSend(tableViewController, sel_registerName("init"));

      void *tableView = objc_msgSend(tableViewController,sel_registerName("tableView"));

      objc_msgSend(tableView, sel_registerName("setDataSource:"),createDataSource());

      objc_msgSend(tableView, sel_registerName("setDelegate:"),createDelegate());

     

      Class NavController = (Class)objc_getClass("UINavigationController");

      navController = class_createInstance(NavController,0);

      objc_msgSend(navController,sel_registerName("initWithRootViewController:"),tableViewController);

      void *view =objc_msgSend(navController,sel_registerName("view"));

      

      //Add Table View To Window

      objc_msgSend(windowInstance, sel_registerName("addSubview:"),view);

    }



    //Create an class named "AppDelegate", and return it's name as an instance of class NSString

    void *createAppDelegate() {

      Class mySubclass = objc_allocateClassPair((Class)objc_getClass("NSObject"),"AppDelegate",0);

      structobjc_selector *selName =sel_registerName("application:didFinishLaunchingWithOptions:");

      class_addMethod(mySubclass, selName, (void(*))applicationdidFinishLaunching,nil);

      objc_registerClassPair(mySubclass);

      returnobjc_msgSend(objc_getClass("NSString"),sel_registerName("stringWithUTF8String:"),"AppDelegate");

    }



    int main(int argc, char *argv[]) {

      returnUIApplicationMain(argc, argv,0,createAppDelegate());

    }


    运行效果:





    IOS高级开发~Runtime(一)

    http://blog.csdn.net/zfpp25_/article/details/9496705

    IOS高级开发~Runtime(二)

    http://blog.csdn.net/zfpp25_/article/details/9497187

    IOS高级开发~Runtime(三)

    http://blog.csdn.net/zfpp25_/article/details/9497721

    IOS高级开发~Runtime(四)

    http://blog.csdn.net/zfpp25_/article/details/9498233

  • 相关阅读:
    开启休眠命令(用户找不到休眠复选框)
    小Q书桌(兼容win10)
    截图,仅截取活动窗口快捷键:Alt + Print Screen SysRq
    Windows10安装Dig命令工具
    拷贝文件保留原创建日期
    重装系统后,QQ(TIM)迁移聊天记录到指定位置
    完全拷贝命令
    Windows10/7 视频、图片、文档、音乐、收藏夹 等文件夹没有原始图标及中文名的解决方案
    js 判断日期大小、是否在时间范围内等处理
    Sql语句 表中相同的记录(某个字段)只显示一条,按照时间排序显示最大或最小
  • 原文地址:https://www.cnblogs.com/MengXY/p/4156727.html
Copyright © 2011-2022 走看看