iOS hotfix lua语法

2021-04-20  本文已影响0人  文子飞_
hotfix lua语法
-- 替换WSFRefundBaseCell类里相关的方法
interface {"WSFRefundBaseCell"}

-- 替换实例方法
function initSubViews(self)
    print("begin------ WSFRefundBaseCell replace function initSubViews ------")
    -- self.super:initSubViews(self)
    -- 1、ORIG:调用原有initSubViews方法
    self:ORIGinitSubViews()
    
    -- 创建UI + 布局
    local button = UIButton:buttonWithType(UIButtonTypeCustom)
    button:setTitle_forState("LuaButton", UIControlStateNormal)
    button:setTitleColor_forState(UIColor:blueColor(), UIControlStateNormal)
    button:setBackgroundColor(UIColor:lightGrayColor())
    self:containerView():addSubview(button)
    -- 2、带下划线的方法:UNDERxLINE 代替 _
    toobjc(button):masUNDERxLINEmakeConstraints(
        toblock(
            function(make)
            make:top():equalTo()(self:containerView()):offset()(40)
            make:right():equalTo()(self:containerView()):inset()(20)
            -- make:top():masUNDERxLINEequalTo(self:containerView())
            -- make:right():masUNDERxLINEequalTo(self:containerView())
            end
            ,{"void", "MASConstraintMaker *"}
        )
    )
    
    -- 设置Label颜色
    local refundContentViewLeftLabel = self:refundContentView():refundMoneyLabel():leftLabel()
    refundContentViewLeftLabel:setTextColor(UIColor:blueColor())
    
    -- 原有UI 更新布局
    local rightLabel = self:refundContentView():titleView():rightLabel()
    rightLabel:setTextColor(UIColor:blueColor())
    local leftLabel = self:refundContentView():titleView():leftLabel()
    
    toobjc(rightLabel):masUNDERxLINEremakeConstraints(
        toblock(
            function(make)
            make:leading():equalTo()(leftLabel:masUNDERxLINEtrailing()):offset()(20)
            make:centerY():equalTo()(leftLabel)
            end
            ,{"void", "MASConstraintMaker *"}
        )
    )
    
    print("end------ WSFRefundBaseCell replace function initSubViews ------")
end


-- 替换实例方法
function setRefundModel(self, refundModel)
    self:ORIGsetRefundModel(refundModel)
    local applyPrice = string.format("Lua实际退款金额:%s",refundModel:realPrice())
    self:refundContentView():refundMoneyLabel():leftLabel():setText(applyPrice)
end
-- WSFRefundCellContentView类里新增属性、方法
interface {"WSFRefundCellContentView", protocols = {"UITableViewDelegate", "UITableViewDataSource"}}

-- 新增 luaTableView 属性
function luaTableView(self)
    if self._luaTableView == nil then 
        self._luaTableView = UITableView:init()
        self._luaTableView:setDelegate(self)
        self._luaTableView:setDataSource(self)
        self._luaTableView:setBackgroundColor(UIColor:lightGrayColor())
    end
    return self._luaTableView
end

function setLuaTableView(self, luaTableView)
    self._luaTableView = luaTableView
end

-- 新增方法(返回值和参数均为id类型) 
function initLuaSubViews(self)

    self.models = LuaTableViewModel:getLuaTableViewModels()

    local view = toobjc(self:luaTableView())
    local orderNumberLabel = self:orderNumberLabel()
    self:addSubview(view)
    -- view:setFrame(CGRect(10,10,300,200))
    print("打印orderNumberLabel = " .. tostring(orderNumberLabel))

    toobjc(view):masUNDERxLINEmakeConstraints(
        toblock(
            function(make)
                make:leading():equalTo()(orderNumberLabel:leftLabel():masUNDERxLINEtrailing())
                make:trailing():equalTo()(self)
                make:top():equalTo()(self)
                make:bottom():equalTo()(self)
            end
            ,{"void", "MASConstraintMaker *"}
        )
    )

    print("打印view = " .. tostring(view))
    return nil
end

function tableView_numberOfRowsInSection(self, table, section)
    local count = toobjc(self.models):count()
    return count
end

function tableView_cellForRowAtIndexPath(self, table, indexPath)
    local cell = table:dequeueReusableCellWithIdentifier("cellID")
    if cell == nil then 
        cell = UITableViewCell:initWithStyle_reuseIdentifier(UITableViewCellStyleDefault, "cellID")
    end
    local text = string.format("第%d个cell", indexPath:row())
    cell:textLabel():setText(text)
    local model = self.models[indexPath:row() + 1]
    cell:textLabel():setText(model:title())
    print("model = " .. tostring(model:title()))
    return cell
end
    
-- 替换initSubViews方法
function initSubViews(self)
    self:ORIGinitSubViews()
    self:initLuaSubViews(self)
end


-- 新增LuaTableViewModel类
interface {"LuaTableViewModel", NSObject}

-- 新增 title 属性
function title(self)
    return self._title
end

function setTitle(self, title)
    self._title = title
end

-- 替换init方法
function init(self)
    self.super:init()
    return self
end

-- 新增类方法(返回值和参数均为id类型) 
function LuaTableViewModel:getLuaTableViewModels(self)
    -- 其中, start是起始值, limit是结束值, step是步进(可省, 默认是1).
    -- i是for循环的local变量, for循环之后i不存在.
    local arrays = {}
    for i = 10, 1, -1 do
        local model = LuaTableViewModel:init()
        local title = string.format("i = %s", tostring(i))
        model:setTitle(title)
        table.insert(arrays, model)
    end
    -- for i, v in pairs(arrays) do
    --  print("vtitle = " .. tostring(v:title()))
    -- end
    return arrays
end
hotfix lua语法
-- OC CGFloat width = [UIScreen mainScreen].bounds.size.width;
-- local width = UIScreen:mainScreen():bounds().width;

-- Lua对象转换为OC对象:toobjc
-- local testString = "Hello lua!";
-- local bigFont = UIFont:boldSystemFontOfSize(30);
-- local size = toobjc(testString):sizeWithFont(bigFont);
-- puts(size);

-- Lua或者OC对象转换为字符串:tostring
-- local num = 123;
-- local str = tostring(num);
-- print(tostring(xxx));

-- 调用类方法
-- [UT commitEvent:123 arg1:@"456" arg2:@"789"];
-- UT:commitEvent_arg1_arg2("123", "456", "789");

-- 替换类方法
-- function commitEvent_arg1_arg2(self, event, arg1, arg2);
-- self:ORIGcommitEvent_arg1_arg2(event, arg1, arg2);

-- 字典/数组
-- toobjc(self:muteDict()):objectForKey("k1")
-- toobjc(self:muteArray()):objectAtIndex(1)
-- toobjc(self:muteDict()):setObject_forKey("v11", "k1")
-- print(self:muteDict()["k1"])

 -- 新增方法(返回值和参数均为id类型)
 -- function myLostMethod(self)
 --         print("myLostMethod")
 --         return nil
 -- end
 -- function myLostMethod_other(self, a, b)
 --         print("myLostMethod_other");
 --         return nil
 --  end

-- 新增属性
-- 方式1:直接使用lua自带的新增属性功能,但是只能被lua使用
-- self.xx = "abcd"
-- print(self.xx)
-- 方式2:模拟OC的增加属性功能,可以在OC访问
-- function xxx(self)
--    return self._xxx   
-- end
-- function setXxx(self, xxx)
--    self._xxx = xxx
-- end

-- 正确使用Lua字符串(Lua string不能直接调用NSString方法,否则会报nil错误)
-- local x = string.len(str)
-- if not tempDeviceID == self:deviceID() then
-- end
-- string1 = "Lua" 
-- string2 = "Tutorial"
-- local s = string1 .. " abc " .. string2 --拼接
-- print(string.format("基本格式化 %s %s",string1,string2))

-- 将Lua字符串转成 OC NSString 对象,再调用NSString的OC方法
-- local x = toobjc(str):length()
-- if not toobjc(tempDeviceID):isEqualToString(self:deviceID()) then
-- end
-- NSString *x = NSStringFromClass(“TestVC”)用local x = self:class():description() 代替

-- 日期格式化
-- date = 2; month = 1; year = 2014
-- print(string.format("日期格式化 %02d/%02d/%03d", date, month, year))

-- 数组(下标从1开始!)
-- local array = {"a", "b", "c"}
-- table.insert(array, "d") --末尾添加
-- table.insert(array, 2, "e") --第二个位置插入
-- for i = 1, #array do
--  print(array[i])
-- end
-- for i, v in pairs(array) do --i为下标
--  print(v)
-- end

-- 字典
-- local dict = {k1="v1", k2="v2"}
-- print(dict["k1"]) 
-- print(dict.k1)
-- 获取到的对象已转为table,而table没有这些方法,想要使用OC的方法可以先通过toobjc
-- toobjc(self:muteDict()):objectForKey("k1")
-- toobjc(self:muteArray()):objectAtIndex(1)
-- toobjc(self:muteDict()):setObject_forKey("v11", "k1")
-- print(self:muteDict()["k1"])
hotfix lua语法参考文档
lua语法常见报错 attempt to index local 'make' (a nil value)
-- 在lua中调用方法一定要用冒号“:”,不然会 attempt to index local 'make' (a nil value)
上一篇下一篇

猜你喜欢

热点阅读