跟踪新创建的子视图

时间:2016-04-19 18:08:15

标签: ios swift

每次创建子视图时,我都想更新一个Int,以便稍后可以引用特定的子视图。

例如,

class circularKey: UIView {
    var oscID = 0; //init to zero

    init(origin: CGPoint) {
        oscID = oscID + 1;
        ...
     }
 }

每次创建一个新的circularKey时,是否可以更新此数字,以便每个circularKey都有自己唯一的self.oscID?

由于

编辑:

我现在正试图从负责添加这些子视图的viewController.swift中执行此操作。

  class ViewController: UIViewController {

    var numOscs = 0; //update when we add a new Bosc
    .... 

    ...
    func didTap(tapGR: UITapGestureRecognizer) {

          numOscs = numOscs + 1
          let newCircularKey = circularKeyView(origin: tapPoint, oscIndex: numOscs)

           self.view.addSubview(newCircularKey)
     }

我的假设是,每个didTap numOscs都会增加,但它只是保持为零。怎么办?

Edit2:没关系,它现在有效:D

我认为最好的解决方案是让调用控制器跟踪到目前为止已经完成的数量。感谢所有的帮助

2 个答案:

答案 0 :(得分:1)

我认为添加子视图的控制器应该每次都处理一个新ID(类似于标记按钮)

无论如何,如果您确实想为每个子视图创建唯一标识符,可以尝试使用CACurrentMediaTime()作为唯一标识符创建一个

E.g。

public String generateHTMLScheduleTable(Schedule s){
        Table scheduleTable=new Table();
        scheduleTable.setCSSClass("scheduleTable");
        Tr dayRow=new Tr();
        Th time=new Th(); time.appendText("Time");
        Th mon=new Th(); mon.appendText("Monday");
        Th tue=new Th(); tue.appendText("Tuesday");
        Th wed=new Th(); wed.appendText("Wednesday");
        Th th=new Th(); th.appendText("Thursday");
        Th fri=new Th(); th.appendText("Friday");
        dayRow.appendChild(time, mon, tue, wed, th, fri);       
        TreeMap<Integer, String> colors=mapCoursesToColors(s);

        String[] days={"m", "t", "w", "r", "f"};

        for(int j=8; j<=22; j++){
            int timeInt=j%12;
            if(timeInt==0){
                timeInt=12;
            }
            String timeHr="" + timeInt;

            //System.out.println(timeHr);

            String amPm;
            if(j>11){
                amPm="PM";
            }
            else{
                amPm="AM";
            }
            for(int k=0; k<2; k++){
                String timeMin="";
                if(k==0){
                    timeMin="00";

                }
                else{
                    timeMin="30";
                }
                Tr currRow=new Tr();
                Td currCell=new Td();
                currCell.appendText(timeHr + ":" + timeMin + amPm);
                currRow.appendChild(currCell);

                for(int i=0; i<days.length; i++){
                    Td newCell=new Td();
                    for(Course c : s.getCourses()){
                        if((c.getTime().substring(0, c.getTime().indexOf(':')).equals(timeHr) || c.getTime().substring(0, c.getTime().indexOf(':')).equals("0" + timeHr)) && c.getTime().substring(0, c.getTime().indexOf('-')).contains(timeMin) && c.getTime().substring(0, c.getTime().indexOf('-')).contains(amPm)){
                            if(c.getDays().toLowerCase().contains(days[i])){
                                String currentColor=colors.get(c.getCRN());
                                String timeLastHalf=c.getTime().substring(c.getTime().indexOf('-')+1);
                                int startHr=Integer.parseInt(timeHr);
                                int endHr=Integer.parseInt(timeLastHalf.substring(0, timeLastHalf.indexOf(':')));
                                int numCells=endHr-startHr;
                                numCells=numCells*2;
                                if(!c.getTime().substring(0, c.getTime().indexOf('-')).contains("00")){
                                    if(timeLastHalf.contains("00")){
                                        numCells=numCells-1;
                                    }
                                }
                                else{
                                    if(!timeLastHalf.contains("00")){
                                        numCells=numCells+1;
                                    }
                                }
                                if(numCells<2){
                                    numCells=2;
                                }
                                newCell.setBgcolor(currentColor);
                                newCell.setRowspan("" + numCells);
                                newCell.appendText(c.getTitle());
                                newCell.appendChild(new Br());
                                newCell.appendText(c.getCourseAndSection());
                                newCell.appendChild(new Br());
                                newCell.appendText(c.getTime());
                                Input submit=new Input();
                                submit.setType("submit");
                                submit.setCSSClass("btn");
                                submit.setName("" + c.getCRN());
                                submit.setValue("Remove");
                                Input moreInfo=new Input();
                                moreInfo.setType("submit");
                                moreInfo.setCSSClass("btn");
                                moreInfo.setName(c.getCRN() + "View");
                                moreInfo.setValue("More Info");
                                newCell.appendChild(new Br());
                                newCell.appendChild(submit);
                                newCell.appendChild(moreInfo);
                            }
                        }
                    }
                    currRow.appendChild(newCell);
                }
                scheduleTable.appendChild(currRow);
            }
        }
        String html=scheduleTable.write();
        System.out.println(html);

        return html;
    }

}

CACurrentMediaTime()将应用程序处于活动状态的时间量返回到双精度,因此希望在循环中添加子视图时每次都应返回唯一标识符。

我不想将数字转换为int值,并在主要答案中搞砸了你的转换,但我认为你可以做到:

class circularKey: UIView {
var keyID = 0.0; //init to zero

init(origin: CGPoint) {
    keyID = CACurrentMediaTime()
    ...
 }

仔细检查一下!

作为旁注:不要使用NSDate,因为它与服务器同步并且可能会出现问题。在它的价值中,这可能真的很难在以后调试。

答案 1 :(得分:1)

如果您的目标是每次创建CircularKey时生成唯一ID(并且您不必关心使用序号来完成工作),只需使用NSUUID类每次生成唯一ID - 这是它的用途。