2012-08-02 108 views
0

我正在一個報價應用程序,我有我的plist設置和plist中的每個字符串作爲自己的報價。有什麼方法可以讓我的View中的某個TextView顯示一個引號,並在每天午夜進行更改,然後將該字符串標記爲已用,以便它不會重複,並以隨機順序繼續進行?從陣列顯示字符串隨機,只有一次,並改變每一天

+1

爲什麼不按順序顯示它們?因爲你只會顯示每個字符串一次它們在plist中出現的順序與任何其他順序一樣隨機! – idz 2012-08-02 18:23:41

+0

這裏有一個不同的@idz,如果它在運行時隨機,那麼具有不同手機的兩個用戶將在同一天看到不同的引號。但是,如果它的訂購,甚至是隨機的,每個用戶每天都會看到相同的報價。或者至少按照相同的順序進行,如果這樣做的話,他們必須在報價被使用之前真正查看報價。 – 2012-08-02 18:25:50

+1

@RyanPoolos是的,只要他們都在同一天開始使用應用程序。只是提出一點,一旦你添加一個條件(如不重複)並不像你想象的那樣隨意!除了評論之外,我也解釋了爲OP提供一個答案,告訴他們如何去做他們想做的事情! – idz 2012-08-02 18:31:41

回答

1

您可以更新您的plist以刪除報價或設置一個標誌作爲使用,然後排除那些被選中。

至於何時標記一個使用。我不確定每天午夜是否適合你的模型如果它真的是隨機的,那麼將它們標記爲午夜使用沒有多大意義,因爲它們可能無法每天打開應用程序,並會錯過任意引號。就好像它被命令一樣,每天都會有一個報價。

編輯從OP:
在AppDelegate中didFinishLaunch我添加以下代碼:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

if (! [defaults boolForKey:@"notFirstRun"]) { 

    [defaults setBool:YES forKey:@"notFirstRun"]; 

    [defaults setInteger:0 forKey:@"verseKey"]; 
    [defaults synchronize]; 
} 
NSTimeInterval date = [defaults doubleForKey:@"startTimeInterval"]; 

NSTimeInterval dateNow = [NSDate timeIntervalSinceReferenceDate]; 

NSTimeInterval difference = dateNow - date; 

difference = difference/84000; 

if(difference >= 0 && difference <= 1) { 

} 

if(difference >= 1) { 
    NSLog(@"ITSMORE"); 
    NSInteger savedIndex = [[NSUserDefaults standardUserDefaults] integerForKey:@"verseKey"]; 
    savedIndex +=1; 
    if (savedIndex == 200) { 
     [defaults setInteger:0 forKey:@"verseKey"]; 
     dateNow = [NSDate timeIntervalSinceReferenceDate]; 
     [defaults setDouble:dateNow forKey:@"startTimeInterval"]; 
     [defaults synchronize]; 
    } 
    else { 
    [defaults setInteger:savedIndex forKey:@"verseKey"]; 
    dateNow = [NSDate timeIntervalSinceReferenceDate]; 
    [defaults setDouble:dateNow forKey:@"startTimeInterval"]; 
    [defaults synchronize]; 
    } 
} 

我相信,此代碼應在firstRun設置爲0的值verseKey並將其與同步NSUserDefaults的。然後,每次啓動時,它會查看是否超過24小時。如果有,那麼它會將1加到verseKey的鍵上直到它達到200(我總共有200個引號)。一旦命中了200,它就會將它重置爲0.然後,我將TextView設置爲objectAtIndex:key以便它改變。聽起來正確嗎?

+0

標記使用的引號的問題在於,如果您有大量的引號,隨着您使用它們,隨機索引將繼續使用已用過的引號,您將不得不迭代。(在最壞的情況下,如果你有大量的報價,只剩下幾個選擇一些,你可能會等待相當長的一段時間才能登陸一個未使用的;-))。保留一組未使用的指數會更好。那麼你總是可以在一次迭代中隨機選擇一個。如果你真的刪除了引號,你仍然需要保留原來的列表,否則你會用完! – idz 2012-08-02 18:38:05

+0

我現在只有200個引號,如果他們不打開每一天,你會提出一個關於缺少引號的好話。現在,每本書都有一個連續幾行的報價,我寧願他們是隨機的,所以它沒有一週看應用程序,只看到一種特定的報價風格。我可能嘗試在加載到xcode之前隨機化數組的順序,然後按順序進行,但我仍然不確定該怎麼說,當應用程序打開時,顯示0行,然後等待24小時和顯示行1 ... – user717452 2012-08-02 18:46:50

+0

如果你想要它從他們上次打開的應用程序非常容易24小時只需存儲一個'NSDate'然後檢查啓動時使用'timeIntervalSinceDate:'然而,如果你想它是每天的事情,無論他們看什麼時間,然後你需要做更復雜的檢查。 – 2012-08-02 19:23:01

1

更新:我之前提到的答案NSMutableSet想到NSMutableArray可能是您更好的匹配您的要求。

保留未使用的字符串的索引數組(您將需要持久存儲該數據,例如在NSUserDefaults中)。你可以在循環中初始化它,並用你所有引號的索引來填充它。所以如果你有200個這個數組將有200個元素[0..199]。每天或適當的時候,從這個數組中選擇一個隨機索引,用它作爲當天報價的索引。將其從陣列中移除並將修改過的陣列寫回NSUserDefaults。當數組有零個元素重新填充所有的索引。請查看NSUserDefaults,NSMutableArrayarc4random

例如,假設您有5個引號。

 
Day 1: 
    unusedQuotes = [ 0, 1, 2, 3, 4 ]; 
    randomly choose index 2. 
    unusedQuotes[2] is 2 so show quote[2] and remove unusedQuotes[2] from array 

Day 2: 
    unusedQuotes = [ 0, 1, 3, 4 ]; 
    randomly choose index 3. 
    unusedQuotes[3] is 4 so show quote[4] and remove unusedQuotes[4] from array 

Day 3: 
    unusedQuotes = [ 0, 1, 3]; 
    ... 
    and so on 

您還應該保存您選擇報價的日期。當用戶再次使用您的應用程序,如果它是相同的日期不要選擇一個新的報價。如果日期不同,只能選擇新的報價。這樣,您就不會錯過報價或在給定日期顯示多個報價。